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.