I suppose it is difficult to say why, because it could be a result of the way the gcode is being interpreted. Special syntax rules may be required because the controller software may not have logic to correctly return to the main program using your syntax.
For example, to alter the syntax, try putting the subroutine call on a seperate line beneath each Z move.
You might also put the Z movement into the subroutine:
O1
G91 G01 Z-.02 F1.
G90
etc.
This would then permit you to write the main program with a single line calling for repeats, something like:
G00 Z0.20000
G00 X0.00000 Y0.06300
M98 P1 L19
First you get good, then you get fast. Then grouchiness sets in.
(Note: The opinions expressed in this post are my own and are not necessarily those of CNCzone and its management)