Para uma matriz (digamos arr ), apenas referindo-se à matriz usando a notação usual de referência de variável $arr é análogo a ${arr[0]} , ou seja, isso se refere ao primeiro elemento da matriz. Isso é o que acontece no seu caso.
Se você quiser se referir a todos os elementos da matriz, quase sempre deseja usar "${arr[@]}" , não "${arr[*]}" . Porque, no último caso, quando citado assim, os elementos seriam mostrados como string única com o primeiro caractere de IFS como separador, por padrão (quando IFS é espaço, guia , newline), o espaço se torna o separador.
No caso em que ${arr[@]} é sem aspas, ele se expande para todos os elementos da matriz com a divisão de palavras e a expansão do nome de caminho ocorrendo ainda mais.
Aqui está um exemplo para você:
$ a=( 11 22 )
$ printf '%s\n' "$a"
11
$ printf '%s\n' "${a[0]}"
11
printf '%s\n' "${a[*]}"
11 22
$ printf '%s\n' "${a[@]}"
11
22
Agora, no caso de b=$(echo "11 22") , você está simplesmente fazendo a substituição de comandos e dentro dessa execução echo "11 12" (em uma subshell), e o resultado está sendo salvo na variável b , que não é um array . Portanto, você recebe 11 12 quando echo -ing $b .
Observe que o lado direito da atribuição de variáveis não passa pela divisão de palavras, portanto, a string 11 12 é salva na variável b , mesmo que haja espaço entre elas.