When I set a summary render it will get the html for the returned SafeHtml object and then escape it before displaying it.

Code:
column.setSummaryRenderer(new SummaryRenderer<MyDataModel>() {
    @Override
    public SafeHtml render(Number value, Map<ValueProvider<? super MyDataModel, ?>, Number> data) {
        return SafeHtmlUtils.fromSafeConstant("<b>" + value + "</b>");
    }
});

com.sencha.gxt.widget.core.client.grid.GroupSummaryView
Code:
protected SafeHtml renderSummary(GroupingData<M> groupInfo, Map<ValueProvider<? super M, ?>, Number> data) {

    ...

    if (cf.getSummaryFormat() != null) {
        value = n == null ? "" : cf.getSummaryFormat().format(n.doubleValue());
    } else if (cf.getSummaryRenderer() != null) {
        value = cf.getSummaryRenderer().render(n, data).asString();
    }

    SafeHtml tdContent = tpls.td(i, cellClasses, cd.getStyles(), cellInner, cf.getColumnTextStyle(), SafeHtmlUtils.fromString(value));

    ...
 
}
The last one should be SafeHtmlUtils.fromTrustedString(value) or SafeHtmlUtils.fromSafeConstant(value) to avoid double escaping.