Você está cometendo dois erros diferentes que jogam juntos. Primeiro, você precisa citar o padrão enviado para grep , caso contrário, o shell o expandirá primeiro. (É daí que vem a mensagem de erro.) Segundo, grep não aceita globs de shell, quer um regex.
zsh sendo o que é, você pode querer dizer
$ ls **/*.{cpp,h} | wc -l
em vez disso, usando um glob recursivo com estilo zsh . Se você quiser usar o outro, é
$ ls -R | egrep '\.(cpp|h)$' | wc -l