Digging a bit deeper in the serialize code, I found ArNoDelta = true seems to force the properties to serialize (please correct me if I am misusing this flag).
My archive’s constructor looks like this now:
FMySaveGameArchive(FArchive& InInnerArchive, bool bInLoadIfFindFails)
: FObjectAndNameAsStringProxyArchive(InInnerArchive, bInLoadIfFindFails)
{
ArIsSaveGame = true;
ArNoDelta = true;
}
So far as my testing goes, this flag has resolved my issue and the original behavior seems to be intentional (an optimization I would assume is valid in usual cases).