Oh man, this was annoying to discover…
jqueryMsg uses the same astCache for all parser objects. This is apparently expected behavior, but I'm pretty sure it's incorrect, as each parser can have different messages under the same key.
mw.jqueryMsg.parser.prototype = { ... * This cache is shared by all instances of mw.jqueryMsg.parser. astCache: {}, ... }