Encontrou a causa raiz de um problema - é porque o sed não combina várias linhas por padrão.
Além disso, encontrei algumas soluções aqui: Como posso usar sed para substituir uma string de várias linhas?
Solução de trabalho para o meu caso especial (usando perl ao invés de sed):
perl -0777 -piE 's/#ifndef ([a-zA-Z_][a-zA-Z_0-9]+)(\r?\n)#define /#pragma once#ifndef #define /gs' 'find . -type f -name "*.h"'