The following post (https://github.com/dotnet/efcore/issues/33442) has the answer.
public static bool IsModified(this EntityEntry entry)
{
if (entry.State == EntityState.Added || entry.State == EntityState.Deleted) return false;
if (entry.State == EntityState.Modified) return true;
var tableName = entry.Metadata.GetTableName() ?? "";
var hasInnerChanges = entry.Context.ChangeTracker.Entries()
.Any(x => x.State != EntityState.Unchanged &&
x.Metadata.GetTableName() == tableName &&
x.Metadata.IsOwned() &&
x.Metadata.IsInOwnershipPath(entry.Metadata));
return hasInnerChanges;
}