Você pode usar arquivos especiais /dev/stdin ou /dev/fd/0 para stdin e /dev/stdout ou /dev/fd/1 para stdout.
No seu exemplo:
echo "abc" | foo -in /dev/fd/0 -out /dev/fd/1
A disponibilidade desses arquivos especiais depende do O.S. você está ligado, mas no Linux (e na maioria das distribuições Linux) você não deve ter problemas para encontrá-los ou usá-los.
Esses arquivos são "virtuais", no sentido de que escrever para um deles não grava dados no disco. A abertura de um desses arquivos especiais equivale a chamar o dup (2) syscall, que duplica o descritor de arquivo existente para um novo.