A ação -print0 é vinculada apenas ao segundo -name "filtro" (teste na expressão de referência), portanto, só imprimirá algo se o segundo filtro corresponder. Isso ocorre porque o operador padrão na expressão de localização é and e se liga mais do que or ( -o ). ou seja, sua segunda expressão é avaliada como:
find -name '*.[chS]' -o \( -name '*.cpp' -print0 \) | xargs -0 echo
Tente agrupar os filtros:
find \( -name '*.[chS]' -o -name '*.cpp' \) -print0 | xargs -0 echo
Você também pode fazer isso se quiser:
find -name '*.[chS]' -print0 -o -name '*.cpp' -print0 | xargs -0 echo