Isso porque sua ação -exe está vinculada ao nome-* ".h" colocando parênteses em torno da expressão e funcionará. a ação padrão será -print é por isso que a expressão inicial funcionou.
find . \( -name '*.cpp' -or -name '*.h' \) -exec echo '{}' \;
Também para eficiência, se você usar | xargs em vez de -exec é muito mais rápido com um grande conjunto de resultados, pois executará um único comando com a lista como argumento em vez de uma chamada individual por item retornado.