Simplesmente porque não existe um operador &(...) em bash . bash implementa apenas um subconjunto de ksh padrões com extglob . Aqui você quer:
grep -Fwn Foo /**/src/**/!(Foo).@(h|cpp)
Com ksh93 , você pode usar & desta maneira:
grep -Fwn Foo /**/src/@(*.@(h|cpp)&!(Foo*))
zsh tem um operador e não com extendedglob :
grep -Fwn Foo /**/src/(*.(h|cpp)~Foo*)