Well, in that case you have no real way to be 100% sure that the cache of the linked object will be created and updated.
CheckDirty is call more often than
ModifyObject so between the two I would go with
Another function you could also use, is
By adding it to a real late moment on the scene execution you could maybe make your deformer to update at the end (op->SetDirty())
You could also use a Message where you can check any change on the scene and check if it's your object that have changed. (by storing it's dirtyState)
Finally, when the link is modified or when someone drop an object you could check what kind of object it is and change the
execute priority accordingly.
I think that
Execute is probably the best solution here.