Hi All
I have achieved what I needed and learnt a few more things in the process. Many thanks for your input.
Whilst I still need to do further code optimisation on the full sketch, particularly in the use of arrays where possible, here is the (cut-down) test code that I used with your guidance. It is a bit crude, but did the business 
#include <Keypad.h>
#include <PCF8575.h>
// ---------------------------------------------------------------------------------------
// Define Keypad
// ---------------------------------------------------------------------------------------
const byte ROWS = 5; //five rows
const byte COLS = 5; //five columns
char keys[ROWS][COLS] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
{21, 22, 23, 14, 25}
};
byte rowPins[ROWS] = {A0, A1, A2, A3, A4}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {A8, A9, A10, A11, A12}; //connect to the column pinouts of the keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
// ---------------------------------------------------------------------------------------
// Define i2c address for relay boards
// ---------------------------------------------------------------------------------------
PCF8575 board0(0x20);
PCF8575 board1(0x21);
PCF8575 board2(0x23);
PCF8575 board3(0x24);
// the delay for point energisation. (Tested with points down to 50)
const int pointtime = 100;
void setup() {
// put your setup code here, to run once:
// open the serial port at 9600 bps:
Serial.begin(9600);
// Set pinMode on all boards to OUTPUT - boards are on i2c:
for (int i = 0; i <= 15; i++) {
board0.pinMode(i, OUTPUT);
board1.pinMode(i, OUTPUT);
board2.pinMode(i, OUTPUT);
board3.pinMode(i, OUTPUT);
}
// Start all boards
board0.begin();
board1.begin();
board2.begin();
board3.begin();
// Set all outputs on all boards to HIGH i.e Relays off - boards are on i2c:
for (int i = 0; i <= 15; i++) {
board0.digitalWrite(i, HIGH);
board1.digitalWrite(i, HIGH);
board2.digitalWrite(i, HIGH);
board3.digitalWrite(i, HIGH);
}
// set debounce time for keypad
kpd.setDebounceTime(100);
}
void loop() {
// put your main code here, to run repeatedly:
// This section reads the keypad matrix
//char key = kpd.getKey();
// check for keypad activity
if (kpd.getKeys()) {
// don't handle multiple keypresses, just single ones, so just use key index 0
const byte key = kpd.key[0].kchar;
const byte state = kpd.key[0].kstate; // IDLE, PRESSED, HOLD, RELEASED
// this section carries out actions with Points and Power
testpointswitch(1, board3, 0, "Point A");
testpointswitch(0, board3, 0, "Point A");
}
}
void testpointswitch(int State, PCF8575& boardname, int pointname, String detailstr) {
switch (State) {
case 0:
boardname.digitalWrite(pointname, LOW);
delay(pointtime);
boardname.digitalWrite(pointname, HIGH);
Serial.print(detailstr + " Main");
break;
case 1:
boardname.digitalWrite(pointname + 1, LOW);
delay(pointtime);
boardname.digitalWrite(pointname + 1, HIGH);
Serial.print(detailstr + " Switched");
break;
}
}