Sorry everyone for garbaging this thread a bit, but I figured out one thorny issue with this whole thing. It's regarding the situation when an owner stops sharing a record.
So, to recap, Fat Xu discovered using purgeObjectsAndRecordsInZone (after making a deep copy) does work to keep the owner's database correct. I was having the issue that the other participants were not getting notification of this change. That was why I went down the road of using viewContext.delete, and then later cleaning up the empty zones so that the change would be received by recipients and the owner wouldn't have a bunch of empty zones building up over time.
I finally discovered why my participants were not getting the notification. It was a bug in Apple's sample app for this. (10015: Build Apps that Share Data Through CloudKit and Core Data). I had used this sample app as a basis for processing remote store notifications.
In that code, after fetching the NSPersistentHistoryTransactions, it checks to see if the results are NSPersistentHistoryResult AND is not empty. That last bit was the problem. I tried searching for documentation that would explain the NSPersistentHistoryResults more, but unfortunately, Apple did not give us much to go by. It turns out that when it's processing the scenario where the owner of a share purges the zone, the result looks different than if it were other types of transactions. The NSPersistentHistoryResult.result is empty, so my code (again, based on the sample code) ignored it.
Once I removed that check for transactions being empty, it correctly passed the notification to my UI that the record is no longer shared and should be deleted.
So, disregard my previous answer with the code to delete unused zones. Just use FatXu's method of making a deep copy, then purging the zone, and as long as you're processing the notifications and persistent history correctly (not using Apple's sample code), then it will work for you.
Cheers!