A few ways to solve this:
2.) Instead of terminating @ViewAccessScoped immediately when a new viewId gets detected we only 'defer' them and clean them up on the following request. If he dropWindowId.js script detects a fresh browser window, it can pass the originalWindowId=123 as parameter so we can 'rollback' the deferring. I know that this is not an optimal solution but it would probably be the easiest way to fix the behaviour.
3.) Implement a history for @ViewAccessScoped beans. This is something which we thought about since a long time already. This would allow recovering on browser back buttons.