Sim,
for f in *{b,c}*
é expandido primeiro para:
for f in *b* *c*
E, em seguida, o loop é executado sobre a expansão independente desses dois globs.
O que você quer aqui é um glob. Aqui, *[bc]* faria, mas para algo mais complexo, em bash , você precisaria ativar globs estendidos semelhantes a ksh. Você provavelmente também desejará a opção nullglob:
shopt -s nullglob extglob
for f in *@(b|c)*; do...
Em zsh :
for f in *(b|c)*(N); do
O (N) sendo para um per-glob nullglob .
Em ksh93 :
for f in ~(N)*@(b|c)*; do