I started to reply to this last night but got my ********* in a twist trying to work it out. This is what I think happens.
This, I think is due to cutter width compensation.
The tool will start at X0 Y0 (which we will take as the centre of the circle). G42 is applied (which for a straight line effectively puts a - minus distance on the X and Y if required). The tool then moves to X2 Y0 to start the circle - it will actually move to X1.875 Y0 (allowing say 1/8 inch for a 1/4 inch cutter)
When describing a circle, GCode has to effectively errect a complete 1/8 barrier round the tool, because, unless it knows exactly which part of the tool is in contact (which takes some really serious maths (sorry Art if you have done it)) there is no other way of applying the offset.
We start to cut the circle, and the offset correctly applies the 1/8 barrier on the outside of the tool.
Unfortunately, as we get to X2 Y0 again, it is still applying it. It correctly stops at X1.875 but also applies it to the Y axis and stops at X1.875 Y-0.125.
Depending on how your GCode is written for each pass depends on whether the "shortage" gets over cut.
If the Code carries on and does another pass, it will be over cut, but say it retracts and goes to X0Y0, then comes out for another cut, the same "mistake" will apply.