Here's how the static checker treats locks and invariants:
If you lock something with the form lock(x.foo) { ... }, the static checker considers x.foo as the protecting lock of x. At the end of the lock scope, it assume that other threads might access x and modify it. As a result, the static checker assumes that all fields of x only satisfy the object invariant after the lock scope, nothing more.
Note that this is not considering all thread interleavings, just interleavings at end of lock scopes.