No, there is nothing strange. Mappings and multisets are referential types. If you have multiple references, changing the contents through one of them will make the change visible through all of them.
write("%O\n", .vars.dict); // changed result
will compile in a reference to the mapping stored in .vars.dict at the time, and if that mapping is mutated this will of course be refelected in the prinout. If you change the _variable_ .vars.dict to refer to a different mapping on the other hand, as you do in `dict = dict + ([ "baz":var ])', the write() will not notice as it already has a reference to the old mapping.
If there is anything which is strange is is that your `dict->foo=var;' managed to modify the mapping printed, because by then the module itself oughtn't have a reference to the same mapping anymore. And when I test your code, I get the exected result that
write("%O\n", .vars.dict); // changed result
does _not_ print a changed result. So you probably had the assignments in a different order or something when you tried (if you put `dict->X=var;' _before_ `dict += ([ "baz":var ]);' the result will be as you describe).
Lesson: if you want to post some code to ask about its behaviour, actually post code that you have observed the behaviour in, not something you just intuitively feel should be equivalent; because if your intution was right you wouldn't need to ask about the behaviour in the first place... :-)