Right, there is no z-index property in SVG; it's just the element order. <g> elements help by grouping things. It's a lot like in drawing programs like Illustrator.
The difference you're running into is that the scatter plot was not using <circle> elements; it was using <path> elements (because it supports other symbols). So when you
.data(jsonCircles)
.enter()
it didn't find anything already there, so the enter() added your circles. With the line chart already using <circle> elements, it finds them already there and there is nothing to add - the enter() selection is empty.
The best way to deal with this is to always use a unique class for your annotations, to not get them confused with the elements in the dc.js chart.
So if you do:
var circles = chartBody.selectAll("circle.annotate")
.data(jsonCircles)
.enter()
.append("circle")
.attr('class', 'annotate')
then d3 doesn't find any circles with class "annotate" and goes ahead and adds them, and the last line adds that marker class. dc.js also does uses unique class names internally, so it won't find yours and get confused either.]
One other pro tip - if you use .on("pretransition", ...) instead of "renderlet", the annotations will get displayed at the same time as the rest of the chart, without a delay. "pretransition" fires immediately after rendering or redrawing; "renderlet" fires after the chart runs animated transitions.
Cheers,
Gordon