Re 1. I think fetchPersistentState is irrelevant here cos all it does is take another nodes persistent state and apply it to its own cache store. Now, if the cache stores are shared, this is pointless. I'm not sure why B is hitting the FCS, you might wanna check TRACE logs to find out. Maybe it's due to preload being on? Or maybe due to requests hitting the cache and that data not being in memory.
Re 2. That's currently not possible. But you can enable preloading so that both nodes bring in enough data into memory. You can limit how much comes into memory by setting eviction.maxEntries to a particular number. The code that's preloading the cache will only preload up to that number of entries into the cache.
Re 3. Preloading is done on a local fashion, so you'd need both nodes with preloading on.