OK, here's what I've done, let me know if you have a better suggestion.
For a little background, my binding is done through a custom PropertyDescriptor that, in GetValue(), does checking to determine if the field it represents is null. It's very similar to your CheckCurrentFieldValueIsNull function. it looks something like this;
if(entity.IsNew && !entity.Fields[fieldIndex].IsChanged)
treat as null;
else if(entity.Fields[fieldIndex].IsChanged && entity.Fields[fieldIndex].CurrentValue==null)
treat as null;
else if(!entity.Fields[fieldIndex].IsChanged && entity.Fields[fieldIndex].IsNull)
treat as null;
You can see where the problem comes from...since the field hasn't changed, IsChanged is false, and since it wasn't refetched (since I didn't actually access a property), IsNull is also true if the first fetch (not the saved value) was null. However, since EntityBase's CheckForRefetch() method is protected, I exposed an internal method called InternalCheckForRefetch() on my custom EntityBase that my base entity classes inherit from, which calls your CheckForRefetch().
Does this sound reasonable?