Quando você executa for i in b{e,\ }s ; do echo $i ; done , a expansão de chave b{e,\ }s é expandida em dois argumentos, um é bes e outro é b s , portanto, o loop for tem dois valores para iterar. Observe que aqui b s é um único argumento.
Por outro lado, em for i in bes b s ; do echo $i ; done , você está mencionando explicitamente três argumentos para iterar (separados por espaços), ou seja, bes , b e s .
No terceiro caso, a substituição de comando $(echo b{e,\ }s) gerará três argumentos bes , b e s , então, novamente, o loop for tem três valores para iterar exatamente como no segundo caso.