That's because there's really only one way to do it: you split your app into a client/server model, where the client (the ui resources) are updated transactionally in the background and swapped into place when they are ready, and there's a local datastore that serves as a cache of the truth and a queue of pending changes.
ServiceWorker is more flexible and powerful than appcache, and you can do other (non-offline related) things with it. That's great. But the fundamental model for building an offline-capable applications is well-understood and unlikely to change. It's the model that all mobile applications frameworks use, what desktop apps used before, and what appcache implemented.