Multiple Wire.OnRequest handlers

My only concern with what you have proposed is that the request handler function could grow quite large

Use a 2 stage architecture:

The requesthandler should only dispatch the request to the right function, something like below.
This keeps the requestEvent rather small and focussed. Every command has its own function.

void requestEvent()
{
  switch(CMD)
  {
  case 0x01: ABC(); break;
  case 0x02: XYZ(); break;
  case 0x03: PQR(); break;
  case 0x04: KLM(); break;
  default: break; // do nothing
  }
}

void ABC()
{
  byte value = readsensor();
  send(value);
}