Try to distinguish in your mind between constructing a bezier path (it's just a path) and drawing the path (stroking and/or filling). The order in which you draw is the "layering" order. So you want to stroke your graph lines - all of your graph lines - first, and then and only then you want to stroke and fill your circles.
That is not what you are doing now. You are constructing the graph bezier path first, but then you are stroking and filling your circles and only then you stroke the graph path so of course it ends up "in front".
So, here's your code (condensed for clarity):
UIBezierPath *barGraph = [UIBezierPath bezierPath];
[barGraph moveToPoint:plotPoint]; // this does NOT draw
for (int ii = 1; ii < [self.testData count]; ++ii)
{
// ...
[barGraph addLineToPoint:plotPoint]; // this does NOT draw
[self addDotAtLocation:...]]; // THIS DRAWS!
}
// and you see we still have not drawn any of the graph lines yet
Thus you are clearly drawing in the opposite of the order you desire.