Thanks for the reply and insights.
I don't think it's a time zone issue. I have another paid consumable "1 day pass" IAP with the exact same timing logic and it works just fine. I'm using relative date/time methods -- i.e. originalPurchaseDate.addingTimeInterval(...) and expiryDate.timeIntervalSinceNow.
From the app logic I can definitely determine that there is a verified transaction for the free non-consumable, but yeah originalPurchaseDate not what I expect.
I'll need to figure out how to add some logging that I can retrieve somehow!