We are aware that dictionary-mode objects are not particularly memory efficient right now, and are working on improving that.
With the current implementation, every used entry in a property dictionary requires 3 words (=8 bytes each on 64-bit), one word each for the property's name, value, and details (writable/enumerable/configurable).
Additionally, dictionaries grow when usage exceeds 2/3 of capacity; this is in order to keep the probability of collisions low.
When they grow, they grow by a factor of 4x. (That smells like a bug; I would guess that the intention was to let them grow by 2x, but the multiplication is done twice.)
What ends up happening is that for objects with 43 properties, the dictionary has capacity 64, consuming 64 * 3 (words per entry) * 8 (bytes per word) = 1536 bytes (+ 7 words metadata). When you add the 44th property, it is grown to capacity 256, now consuming 256 * 3 * 8 = 6144 bytes (+7 words metadata). On the bright side, you can then grow your objects all the way up to 170 properties without increasing memory usage. So the overhead you're measuring will depend a lot on just how many properties you're adding.
Side note: if you know the set of properties that will be added in advance (just not their order), then it might be a good idea to initialize all of them in the object's constructor, and fill in their actual values later, so that you'll benefit from faster and slimmer objects. Roughly:
function MyObject() {
this.prop1 = undefined;
this.prop2 = undefined;
// etc...
}
function OnNetworkReceived(object, prop, value) {
object[prop] = value; // prop is "prop1" or "prop2" or ...
}