Assumindo que "sem extrair" você quer dizer "sem salvar os arquivos extraídos no disco":
for file in *.tar.gz ; do
tar xzOf $file b | grep --label=$file/b -H foo
done
opções de tar:
x extrair z gunzip antes de extrair O dump para stdout em vez de criar o arquivo (letra maiúscula oh, não o número zero) f do arquivo tar especificado
opções grep (sugeridas por JJoao)
--label=... use o rótulo especificado como o nome do arquivo% -H print filename para cada correspondência