limite en string ?

Asumiendo Atmega328P: tiene 2048 bytes de RAM; y si el 60% está siendo usado, entonces hay 820 bytes libres.
Por lo que puedan consumir las variables locales, quizá haya apenas 600 bytes realmente libres.
Si almacenamos caracteres con un objeto String, por mucho le doy un límite de 250 caracteres si el búfer interno pasa creciendo constantemente; 500 si el espacio se preasignó a la hora de instanciar.

Dejando de lado la memoria RAM, aún existen límites pero más difíciles de alcanzar:

unsigned int totalBytes=myFile.size();

Es un límite que estás imponiendo. De ese modo, el archivo no debe tener más de 65535 bytes/caracteres (64 KB). available es peor: el límite viene siendo la mitad de esa última cifra.

size retorna unsigned long; por lo tanto, el límite definitivo se extiende a una cantidad descomunal de 4294967295 bytes/caracteres (4 GB). No solo es el límite definitivo por implementación o tipo de dato, también lo es por el mismo sistema de archivos FAT32.

Si la memoria RAM fuera infinita, aún tenemos una restricción que impone el compilador: un vector (array) no puede ser de más de 32767 bytes/caracteres (32 KB).

Si lo único que buscas es volcar un archivo al puerto serial, no hay razón para retener datos en RAM; ¡"suéltalo" de una vez!
available no es la mejor opción para determinar el fin de un archivo mayor a 32 KB, para eso utiliza una variable unsigned long y size.

Mi recomendación:

// UltimaPosicion debe ser global y de tipo unsigned long

void sd() {
 File myFile = SD.open("startup2.txt");
 if (myFile) {   
  if (UltimaPosicion >= myFile.size()) UltimaPosicion = 0;
  myFile.seek(UltimaPosicion);

  for (unsigned long faltantes = myFile.size() - UltimaPosicion; faltantes; faltantes--)
   Serial.write(myFile.read());

  UltimaPosicion = myFile.size();
  myFile.close();
  delay(1000);
  Serial.println();
 } else Serial.println(F("*** Error al abrir el archivo ***"));
}