You have several events that are triggered in various points of the graph life:
https://dc-js.github.io/dc.js/docs/html/dc.baseMixin.html#on
What seems similar to underlayCallback is either the renderlet or the pretransition event. from the callback, you can do pretty much everything, like rotating the axe labels, tracking new click events, adding new svg elements...
There is an example here of drawing an extra line:
.on('renderlet', function(chart) {
var left_y = 10, right_y = 70; // use real statistics here!
var extra_data = [{x: chart.x().range()[0], y: chart.y()(left_y)}, {x: chart.x().range()[1], y: chart.y()(right_y)}];
var line = d3.line()
.x(function(d) { return d.x; })
.y(function(d) { return d.y; })
.curve(d3.curveLinear);
var chartBody = chart.select('g.chart-body');
var path = chartBody.selectAll('path.extra').data([extra_data]);
path = path
.enter()
.append('path')
.attr('class', 'extra')
.attr('stroke', 'red')
.attr('id', 'extra-line')
.merge(path);
path.attr('d', line);