I'm not really sure what the appropriate behaviour should actually be here. How does this appear visually? Does it just look like there is empty space in place of the hidden cells (but positioning is still correct)?
I have major concerns about changing table navigation commands to just move to the next possible row or column, regardless of how many rows/cols we're skipping. Users rely on these commands to get a spatial "feel" for the table. If the commands are jumping columns and rows here and there, that spatial mapping gets rather broken. If there is an empty space, I think I'd prefer to treat this as an empty cell, as this is probably closer to how sighted users see it.
Visually this is just a normal 3 x 3 table, I didn't actually hide the missing cells, but if you add visibility:hidden to the cells that have aria-hidden="true", then those cells disappear without shifting anything else visually.
I'm not suggesting that the table navigation commands move to the next possible row or column. I think it's still up for debate what we should do for tables with many empty rows or columns.
In this case, though, what NVDA does now gives the user no indication that they've navigated to a missing cell. Maybe it could just say something like "missing cell" but announce the row and column header, if present? That would make it easier for users to navigate through tables with missing cells.
This is a really tricky situation. To navigate to anything, NVDA expects it to be there. It doesn't make sense to navigate to a hidden cell because it's hidden, so it doesn't exist. I'm actually surprised NVDA doesn't just say "edge of table" in this case; I'm guessing IAccessibleTable2 is returning something unexpected, but I'll need to investigate.
I don't know what we can really do to fix this without additional API. As discussed on the IA2 list, just walking the tree is not a sane option IMO.