This is correct behavior.
ls [bd]
Prints files inside the directory b
and that is empty.
To test further you can do:
touch b/foo
ls [bd]
Which will give output
foo
PS: However in your first command when you do ls [abc]
there are more than one matching directories in current path a
and b
hence you get the output as shown in in your question.