so this is for controlling turnouts on a model railroad?
it's not clear what you think is duplicated.
on a Interlock project i'm working on, i manage things by routes and the data structures identify the hardware to control the turnouts.
i sounds like you have two arrays, one for each PCA board, but would like not to have multiple arrays. it's hardware centric instead of turnout centric. if this is the case, why not have a field that identified the board?
looking at the code, it looks like a C/MRI command is received to set an turnout position bit, "Tbit" and then processTurnouts() is invoked to adjust the turnouts by scanning the tables and updating each turnout regardless if it is affected or not. (assume you want to do this to so that the servos move slowly).
code is duplicated to processing "turnArray0" and "turnArray1" separately.
processTurnouts() could have been passed a pointer to the array to process and called once for each array.
but by simply including a board ID for each turnout, the arrays could be combined.
the code is also duplicated for incrementing vs decrementing the servo position by 2. that duplication could be removed by determining a direction (e.g. +/-2)
i think i'm addressing your concerns to streamlining the data and code. there are quite a few improvements possible