You mentioned v6, on v7 it works differently, it's this way by design.
I don't know how is :set command implemented inside ros v6 and v7, in fact probably only few people know that. But it does'n matter - it should assign value of second parameter to first one.
In manual there is exactly written: ":set <var> [<value>] assign value to declared variable." - this seems perfectly clear and logical.
But my question is why (in ros v6) :set x {"a"=1;"b"=1;"c"=1} assign to x {"a"=1;"b"=1;"c"=1} in first pass, {"a"=2;"b"=1;"c"=1} in second and {"a"=2;"b"=2;"c"=1} in third - that is not much expected behavior.
Maybe I missed something important in manual, but if not then it looks like that :set implementation for array in ros v6 is somehow broken.
And to ":", it should be there, I misstyped it when testing behaviour from console. Parser doesn't protest, you noticed that is missing. Just to be sure that problem is not caused by that I tested both variants first in v6 and then in v7 to have exactly same testing scenario. Teoretically it should not work without :, but somehow it doesnt matter to parser. But that is not problem which I talking about - problem is that incorrect value end up in variable.
PS:
Ive found this when writing quite complex script (after hour of debugging why first item is processed corectly and subseqent items not) and posted code is cutted down to show exact where I see problem.