I see a few options here.
1) Snapshots are pretty much instantaneous, so just schedule the rsync task to occur after the snapshot task. OK, scheduling snapshots is tricky, but if you set up the task and then rename the latest snapshot so the time is when you want the snapshots to occur, it should be reliable. (Basically, if you want snapshots to occur on the hour: set a snapshot task, wait for it to run, use "zfs rename" to change name of the snapshot so the minutes part of the name is "00". Your next snapshot for that task should occur on the hour.)
Is it really that important that you get a snapshot right after the rsync completes?
2) Instead of relying on two tasks to rsync and snapshot, write a wrapper script that executes the rsync command and then makes a new snapshot. You can even name the snapshot using the same format as the snapshot task would (@auto-YYYYmmdd-HHMM-"retention time (2m/4d/3w/etc.)"). Rsync should indeed not return until the task is complete, unless it was invoked with an '&' at the end to indicate that it should be a background task.
Personally, I picked option 1. Once you've got a few rsync tasks running, for varying sizes of data, it gets harder and harder to make sure you're snapshotting after everything is done. So instead, just snapshot on each hour and run your rsync tasks right after that.