O redirecionamento acontece na máquina de chamada, não na máquina remota, portanto, o arquivo resultante será local. Além disso, o grep não precisa ser executado remotamente:
while read -r host; do
ssh "$host" ps -ef | grep "defunct" >"output.$host"
done <hosts.txt
Isso executa ps -ef em cada host e grep extrairá as linhas defunct de saída. O grep será executado localmente, não remotamente. O arquivo de resultado, da mesma forma, é criado localmente.
Se você quiser um único arquivo de saída:
while read -r host; do
ssh "$host" ps -ef | grep "defunct"
done <hosts.txt >output.txt
Ou mesmo (para uma única invocação de grep )
while read -r host; do
ssh "$host" ps -ef
done <hosts.txt | grep "defunct" >output.txt