I think this is a side effect of the feature, sadly. The field is excluded and for the entity its value is 'null'. When you set it to null explicitly, the value actually doesn't change (null stays null) and the field isn't marked as changed.
There are a couple of ways around this, the easiest is this:
instead of:
e.SetNewFieldValue((int)PersonFieldIndex.Photo, photo);
do:
e.Fields.SetCurrentValue((int)PersonFieldIndex.Photo, photo);
This will always set the changed flag and should make the field 'dirty', causing it to be picked up. It also bypasses checks whether the value is the same, so it will always set it to a new value in the DB issuing an update query.