Eu acho que você não pode sair sem usar um arquivo temporário. zsh tem suporte embutido para isso com sua forma =(...) de substituição de comando.
Aqui, para verificar a ortografia do conteúdo de uma variável (da saída de printf %s $string ):
{
(){
aspell check -x $1 >&3 3>&-
cat $1
} =(printf %s $string) | IFS= read -rd '' corrected_string
} 3>&1