I find it a bit odd that the stacktrace doesn't reveal the origin of the exception, did you also examine the inner exception?
Anyway, I think why this happens as you also described: entity X gets inserted, is marked as outofsync, validator of other entity looks at fields of X, this triggers the outofsync error.
The exception class itself is not really helpful in all cases indeed, that is: it's sufficient for the main reason it's thrown: some code reads a property of an entity which isn't refetched, this is easy tracked down by a stacktrace. However in your case, this isn't really sufficient, you need the original entity.
I think if we pass in the entity which caused the exception to throw, it would be more sufficient. I'll make a change request for this.
Now, back to your problem. There's an easy shortcut for getting entities marked as fetched after a save, instead of simply refetching them which can be performance intense and unnecessary if you don't need it. See: Entity2.MarkSavedEntitiesAsFetched and this documentation page.
In short, it simply marks a saved entity as 'fetched', so you don't run into the problem with outofsync anymore. it's a global setting, though in almost all cases you're fine. The only cases to be careful with is when you have default values /constraints defined in the database and you don't set these fields to a value AND you access the entity after the save: the entity then has to be refetched: before you'd get an exception (out of sync) and with this setting you won't.