Para obter cada nome de arquivo impresso na saída e, ENTÃO, ter os resultados do grep correspondentes àquele arquivo impresso depois, você pode agrupar o -exec foo {} | grep pipe em um shell:
find . -name '*.o' -type f -print -exec sh -c 'foo "$1" | grep "bar"' sh {} \;
Para fazer com que o argumento -H do grep funcione com a entrada padrão, se a sua versão de grep suportar a opção --label= , você poderia fazer
find . -name '*.o' -type f -exec sh -c '
foo "$1" | grep -H --label="$1" "bar"
' sh {} \;
ou (se a sua localização suportar a alternativa + de vários argumentos para \; ):
find . -name '*.o' -type f -exec sh -c '
for f; do foo "$f" | grep -H --label="$f" "bar"; done
' sh {} +