Acho que, uma vez que você usou o operador -or , é necessário mantê-lo consistente para evitar uma ordem ambígua de operações lógicas quando houver várias condições conectadas usando OR lógico.
Parece que a parte -exec está agrupada com o segundo -name "*.h" .
Portanto, para que funcione corretamente, adicione os colchetes conforme abaixo:
find . '(' -name '*.cpp' -o -name '*.h' ')' -exec echo {} ';'
Remember: The parentheses must be quoted or escaped with a backslash to prevent them from being interpreted as special shell characters.
Como alternativa, combine algumas extensões em uma usando -regex :
find . ! -regex ".*\.\(cpp\|h\)" -exec echo {} \;