The output from the assign to user step must be assigned to a different variable than your 'master copy'. I am doing something similar where each user can update a section on the form specifically allocated for him/her. As I loop through to assign the forms, I put the loop index into the form data. So each user has a separate copy with the corresponding index. After submit, I pull the index out and merge that one users data into the master copy.
/process_data/@processIndex = number(/process_data/tempForm/xdp/datasets/data/Formdata/userIndex)
/process_data/xfaForm/xdp/datasets/data/Formdata/Approvers/Approver[number(/process_data/@processIndex)] = /process_data/tempForm/xdp/datasets/data/Formdata/Approvers/Approver[number(/process_data/@processIndex)]
If anyone can edit any part of the form, you are not going to get around the whoever saves last wins issue. Each user's copy of the form is a snapshot at the point of assignment, not render. So the second (not counting originator) user will not see data entered by the first. I use a custom render that reads the latest master copy out the database.