How does hidden classes really avoid dynamic lookups?

So we have all heard that v8 uses the thing called hidden classes where when many objects have the same shape, they just store a pointer to the shape struct which stores fixed offsets. I have heard this a million time, and I very much get how this reduces memory usage by A LOT (not having to store a map for each one is amazing) and potentially because of that a bit faster performance.

However I still don’t understand how it avoids dynamic lookup. The only thing I have heard is storing a cache between a string (field name) and a fixed offset, and checking it every time, but if there’s a cache miss (which is likely to happen) there will still be a dyanmic lookup.

Everyone says that this is almost as fast as C++ field access (which are just a mov instruction usually), however this 1 field access cache isn’t even close.

Look at the following function:

function getx(o)
{
    return o.x;
}

How will v8 make the access of the x field so fast and avoid dynamic lookup?