Running out of Sram / program hang.

Twisting wires together doesn't cancel interference unless those two wires carry equal-but-opposite signals that are fed to a balanced input. AFAIK, it can only hurt as the signals may then couple to each other.

Also, I would refactor your module like so:

char data[8];  // Forget _d0-_d7

uint8_t Maxim6955::write(uint8_t chr) {
  
  Wire.beginTransmission(_address);
  Wire.write(0x20);
  
  // Shift values back one digit, writing along the way to save a second loop
  for (uint8_t i = 1; i < 8; i++) {
    Wire.write(data[i]);
    data[i-1] = data[i];
  }
  
  // Shift in new char and write it
  data[7] = chr;
  Wire.write(chr);
  
  Wire.endTransmission();
  
  // Return an error code if you have one...
  return (TWI_error_code);
}


// Print C-style strings
uint8_t Max6955::print(char *str) {
  uint8_t i = 0;
  uint8_t ret;

  // Loop through C-style string and write each char
  while (str[i] != 0x00) {
    ret = write(str[i]);
    if (ret != 0) break;
  }
  
  // Pass along any errors
  return ret;
}

// Overload print for C++ strings
uint8_t Max6955::print(String str) {
  // Loop through string chars one at a time, calling write(char) for each
  // Return error code from write(char) if != 0
}

// You may wish to overload print for ints, floats, etc.  Up to you.

// Call print with 8 spaces
uint8_t Max6955::clear() {
  return print("        ");
}

I'm a C guy, so I'm not totally up to speed on C++ .. at least, the finer details of classes. I'm halfway through a book, but not ready to write my own code here, so you'll have to fill in the details on the C++ String handling, and any errors I made on calling conventions within a namespace.