Soo I finally got this working, and the finished block is attached below for anyone who wants a look.
I redefined the geometry to run off a single linear parameter in each direction. This runs the two arrays, both of which are set to a minimum value of 0 and increments of 616 (the width of the middle seat). I then tie these into a pair of stretches which position the end seat at the end of the array.
Also in the same two stretches are a pair of lines which are used purely to generate the overall sizes to be used in fields in the attribute (this is why I stretch the end pieces rather than use moves).
The real "magic" to make the middle pieces disappear when necessary are managed through a combination of lookups and visibility states. The block includes options for three different types of activity zones (none or Furniture Only as I call it, HQI, Lifetime Homes, or mobility). Each activity zone option needs four states - 0x0y, 1x0y, 0x1y, and 1x1y depending on whether the horizontal (x) or vertical (y) intermediate seat is needed. This leaves me with 16 visibility states in all!
So from a user's perspective it starts with a lookup to select the usage zones tying into the 1x1y visibility state for each ("Choose Zone lookup" screen grab). In each "zone state" there is a pair of lookup which read the two linear parameters and use them to set a code based on their value. And is shown in the "calculated lookup" screen grab attached. The Final Lookup, also attached as a screen grab, takes the code generated from the distance calculations to set a final visibility state.
Thanks to everyone on this thread who helped with the block, and I hope this post will be able to help someone with a similar challenge in the future.