I definitely understand the issue given that usually storing UTC and then displaying it in the “local” format is pretty simple with various helper functions (you can even do it server side as $dateToString takes timezone).
What I would recommend is using either $dateToString or antoher aggregation function $dateToParts to deal with this - depending on what you want to do with result.
db.tz.find()
{ "_id" : "Asya", "tz" : "America/New_York" }
{ "_id" : "Stennie", "tz" : "Australia/Sydney" }
{ "_id" : "Alex", "tz" : "Australia/Sydney" }
{ "_id" : "Joe", "tz" : "Europe/Dublin" }
Fetched 4 record(s) in 2ms
> db.tz.aggregate({$addFields:{now:{$dateToString:{date:new Date(), timezone:"$tz"}}}})
{ "_id" : "Asya", "tz" : "America/New_York", "now" : "2020-02-16T11:14:02.734Z" }
{ "_id" : "Stennie", "tz" : "Australia/Sydney", "now" : "2020-02-17T03:14:02.734Z" }
{ "_id" : "Alex", "tz" : "Australia/Sydney", "now" : "2020-02-17T03:14:02.734Z" }
{ "_id" : "Joe", "tz" : "Europe/Dublin", "now" : "2020-02-16T16:14:02.734Z" }
If you are on 4.2 you can even generate current time server-side with $$NOW expression.