I was able to find a workaround, but I would still very much like to know the right way to do this.
My workaround was to Loop through all of the transformed results and call another workflow that actually sent the emails. Since the called workflow is only sending one email at a time, it knows which one succeeded or failed and can update the correct database record.