Modellbahn-Basteleien

Das wird noch besser.
Die Variablendeklaration für den Hallstatus brauchst Du nicht da, wo sie jetzt ist.

Wenn Du die nur in den Funktionen abfragst, dann am Beispiel von einem Zweig:

void HALL1A() // Funktion für Hallsensor1
{
  bool hallStatus = digitalRead(hallSensorPin);
  // Bremsen M2
  if (hallStatus == LOW)
  {
    for (int i = 240; i >= 0; i -= 40) //in 40-iger Schritten bis Maximalgeschwindigkeit
    {
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);   // Motor 2 beginnt zu rotieren
      analogWrite(GSM2, i); // Motor 2 bremst
      delay(500);
    }
  }
  // Beschleunigen M1
  if (hallStatus == LOW)
  {
    anfang = millis();
    while (millis() - anfang < warte); //nach dem Bremsen M1 warten=Halt, dann
    for (int i = 0; i <= 240; i += 40) //in 40-iger Schritten bis Maximalgeschwindigkeit
    {
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);   // Motor 1 beginnt zu rotieren
      analogWrite(GSM1, i); // Motor 1 beschleunigt
      delay(100);
    }
  }
}

Wobei mir noch nicht klar ist, warum Du beides auf low abfragst.
Und dann hauen Dir die ganzen delays die Füsse weg.

Tipp von mir: Nochmal die Nachtwächtererklärung BlinkwithoutDelay - Die Nachtwächtererklärung und das BlinkWithoutDelay-Beispiel nehmen.

Mir sieht das sehr nach einer Schrittkette aus.
Ich hab nur noch nicht verstanden, ob die beiden (hall1a / hall1b) zusammengehören oder getrennt zu betrachten sind.