Eu não acho que você pode conseguir isso usando ps sozinho. Você está certo de que filtrar usando grep não é o ideal, mas se você está disposto a dar uma chance a pgrep , então você pode chegar bem perto de sua exigência com:
ps -p $(pgrep -f bar -d',')
A opção -f faz com que pgrep pesquise a linha de comando completa (em vez de apenas o nome do processo), enquanto a opção -d especifica o delimitador a ser usado para encadear os pids juntos.
Passar a lista pid para ps limita a saída para aqueles que contêm a palavra-chave no comando completo (que inclui os argumentos).
No seu exemplo em que você deseja corresponder "foo bar", mas não "foo barbaz", você procura uma correspondência exata com:
ps -p $(pgrep -f "foo bar$" -d',') # Note the eol anchor '$'