I have found a way which seems working fine. Posting here for the benefit of others. Although this is still not SQL equivalent of join and update, and still needed updates for each record individually, the performance was very good.
update_list = []
for val in values:
update_list.append(UpdateOne({'_id': val['_id']}, {'$set': {'xyz': val['xyz']}}, upsert=True))
collection.bulk_write(update_list)
Essentially, we have to build a list of individual UpdateOne commands, and execute in bulk using bulkwrite (I was using Python in this example).