Does this make any sense at all?
Yes, but there's several different type checking rules at play here.
object is basically a generic type that represents an object that has no known properties to the type checker. It allows you to assign any kind of object (non-primitive) to it with any kind of structure, because that's the point of it -- the similar Object and {} types also define no known properties, but allow primitives (like string) to be assigned, since Object is the base of all JS objects. object was added later as a means to express a non-primitive object. In any case (object, Object, or {}) when you try to access a specific property like m.name the type checker doesn't know what that is, so you get an error. The index based property assignment m["name"] has looser restrictions by default, even though the type checker still doesn't know what that is you don't get an error -- unless you turn on noImplicitAny then you do get an error on m["name"] saying:
Element implicitly has an 'any' type because type '{}' has no index signature.
This should point you in the right direction: if you want to describe an object with unknown properties of some type, you should define an index signature:
let m: { [key: string]: string; };
m = { name: 'qwerty' }; // works
m.name = 'xyz'; // works
m["name"] = 'abc'; // works