A gênese do problema que você está vendo se deve à forma como a tokenização acontece em uma linha de comando. Nesse caso em particular, muito antes de o $(echo 'echo | tac') ser expandido, o shell já descobriu que você pretende executar um comando ( echo {…} ) e passar sua saída por meio de um canal ( | ) para outro comando ( xargs -n 2 $(…) ).
Em seguida, no próximo estágio, o preenchimento de $(…) e a expansão de suporte {…} geram os comandos reais a serem executados. E nesse estágio se resulta em um caractere de pipe, então, é tarde demais e é claramente perdido o ônibus.
Agora ele será tratado como não como um metacaractere especial, mas será incluído na linha de comando xargs como qualquer caractere comum (= > não-metachar).
Se você quiser dar outra chance, precisará eval .
eval "echo {0..9} | xargs -n 2 $(echo 'echo | tac')"
Isso produzirá o que você espera.