From what I can tell, device_update_preprocess is supposed to detect modified attributes and flag the device_vector for a copy through device_update_flags.
However, since object attributes are only created in device_update_attributes afterwards, they can't be included in that check.
Therefore, I've changed the function that actually updates the device_vector to tag it as modified as soon as its content gets updated.
This fixes the issue, but I'm submitting this as a patch just to make sure that I'm not missing a larger design consideration here.
Also, I feel like with this change, we can actually get rid of the device_update_flags modification tracking altogether?