After looking through implementation of Qt positioners (qquickpositioners.* in qtdeclarative) I have found that the positioning itself is done in updatePolish method while in itemChange and onCompleted methods positioning is schedule and polish is called.
At this point I don't completely understand how it works, but it resolved my problem and I didn't have to resort to using qt private modules.