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