Решением, которое я использовал в итоге, был пользовательский рендер, связанный с t: datatable (расширение tomahawk для datatable)
public class HtmlMultiHeadTableRenderer extends HtmlTableRenderer
Мне нужно было переопределить только один метод
protected void renderFacet(FacesContext facesContext,
ResponseWriter writer, UIComponent component, boolean header)
, в котором я искал фасеты с именами header, header2, header3 ... headerN (я перестаю искать, как только отсутствует один) и то же самое с нижним колонтитулом. Это позволило мне сделать код вроде
<h:dataTable ... var="row">
<h:column>
<f:facet name="header">
Header
</f:facet>
<f:facet name="header2">
A second Tr with th's
</f:facet>
<h:outputText value="#{row.value}"/>
<f:facet name="footer">
FirstFooter
</f:facet>
<f:facet name="footer2">
Second Footer in a new tr
</f:facet>
</h:column>
</h:dataTable>
Это заняло около одного дня (с некоторыми другими расширениями, такими как разрешение colspans на основе групп) для кодирования и документирования,