Eu não acho que você pode usar utilmente atribuições de variáveis em segundo plano (com substituição de comandos ou não), já que as tarefas em segundo plano são executadas em uma sub-camada. por exemplo,
foo=x
foo=$(echo y) &
echo "$foo"
imprimirá x
, já que a segunda atribuição só se aplica à sub-camada.
Por outro lado, baseando-se no interior da substituição do comando não faz o que você quer, o shell aguarda o comando de qualquer maneira, e você obtém as tarefas executadas sequencialmente:
sleepecho() { sleep "$1"; echo "$2"; }
foo=$( sleepecho 5 abc & ) # returns after five seconds
echo "$foo" # prints 'abc'
O que você poderia fazer seria armazenar a saída dos comandos em arquivos temporários. Isso permitiria que o backgrounding funcionasse, e também poderia ser melhor se a saída fosse muito longa.
dir=$(mktemp -d)
for h in "${hosts[@]}" ; do
ssh "$h" "$cmd" > "$dir/$h" &
done
wait
do something with "$dir/"*
Embora existam várias soluções prontas para executar comandos em vários hosts via ssh
...