Your understanding is mostly correct. Firebase will use the latest value to supply the current value for the transaction. If there are no local listeners, it will "guess" null the first time the transaction is sent to the server. If a local listener exists, it will just use that value.
Firebase will not always cache the value in a Promise chain. If you just use a once(), we will clear the cache after it is successful (as far as I'm aware). The only way to keep the value cached is via an on() listener (again, as far as I'm aware).
Functions is a bit special since although the Functions environment and firebase-functions SDK know what the current value actually is (the function got called with that value after all), the regular Firebase SDK (in this case, it's the Admin Node.js SDK) uses a different cache and does not know the value. And given that this is a relatively new feature, there is no way to prime the cache for the Admin Node.js SDK unless you actually create a listener. However, you are better of just having the transaction guess null initially and handle that case in your transaction function.
Does that makes sense? It's a bit hard to explain this concept so apologies if I am still not making sense. If you still have questions, I can try to explain it a different way or get someone else who understands it even better than I do to answer it.
Jacob