I found a work around for your small project, I would place a @State string on the TableView or ListView and place an onChangeModifier on the selectedItem to update the string. Then I would @Bindable that String to the Sheet and compare both string once cancel in call. If they are different I would save the old version. This is a quick and dirty way about solving this issue right now. For larger applications I would recommend doing this. Yes, it has to be on the Collection View for how SwiftUI redraws the views all the time.
Also I don't know if you know this but if you call save after doing a rollback and not restarting the application it will take what ever is in the SwiftUI View and save that back to the database. So, always restart your application before calling modelContext.save().
In the CoreData days we would just reset the Context and Fetch a new list of item from CoreData. Without having to restart the application, you could make CoreData Model and that stack to call that one function but I don't really think it I worth it.
People with larger apps, I would pretty much make a secondary struct to hold that information in until this bug gets fixed. It is a big one. I even tried some of my old tricks that I used to use with CoreData to get the UI to update, and none of them have work with this framework.