Object-oriented code tends to generate large intermediate representations, too large to be inlined and too complex to be partially evaluated at compile-time. I wouldn't expect this sort of optimization to work.
You might have better luck with first-class modules if you want some sort of tuple subtyping.
(Performance model: with modules, subtyping coercions are compiled as a field-reordering copy,
so the runtime cost is on the coercion rather than the field access.)
> Also as a related question, is there a way to have the lookup semantics of methods without the open recursion part?
We could add row-typed extensible records to the language. Given how little the object-oriented layer is used in practice, I am not sure that this highly work-demanding addition would be a good use of a contributor's time -- and its utility would have to be weighted against the complexity cost of adding yet another kind of product structure.