This is totally the case in nomination pools point/balance logic as well. Points is almost always the same as balance, and all wallets have to re-implement it.
In the short term, we will fix it with runtime API. Long term, this could be a good excuse to try out the wasm view functions as well.
I think this only applies to the Balance
example and XCM is not so relevant for the broader use cases
Here’s an alternative: tap into the existing machinery for RPC-based storage update notifications. The runtime would be allowed to declare a set of “virtual storage items”. these are never stored anywhere and are instead “getter functions” as you said. They have a key in the trie as well, ergo a client can subscribe to them in the same way that it can subscribe to a normal storage item.