Нашел основную причину проблемы - это потому, что sed не соответствует нескольким строкам по умолчанию.
Кроме того, нашел несколько решений здесь: Как я могу использовать sed, чтобы заменить многострочную строку?
Рабочее решение для моего особого случая (с использованием perl вместо sed):
perl -0777 -piE 's/#ifndef ([a-zA-Z_][a-zA-Z_0-9]+)(\r?\n)#define \1/#pragma once\2#ifndef \1\2#define \1/gs' `find . -type f -name "*.h"`