Sim, porque a substituição do comando é executada pelo shell antes que o xargs seja iniciado. O echo na substituição imprime a string literal {} para sed para manipular. sed não faz alterações, e o resultado é que xargs vê
echo {} {}
Em vez disso:
echo 'abc' | xargs -I{} bash -c 'echo "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}
Aqui, evitamos que o shell avalie a substituição do comando incorporando-o em um script in-line. O script recebe o argumento de linha de comando ( abc ) de xargs e o manipula como "$1" .
Seria ainda melhor usar printf caso você tivesse a idéia de substituir o a por um traço e os outros caracteres por algo que seria interpretado como uma opção para echo :
echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}
Ou, sem sed :
echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "${1//b/f}" "$1"' bash {}
Ou, você poderia fazer isso apenas com sed (pelo menos neste exemplo simples):
echo 'abc' | sed 'h; s/b/f/g; G; s/\n/ /'