Input state is stuck HIGH when function called using input also uses same input to call another function
There needs to be a delay() after the button state is read to allow time for it to return LOW, dumba**.
You already have enough delay() in your textN() functions, just check the button state after calling that function, not before. Code should be as follows:
void loop()
{
  question1();
}

void question1()
{ 
  if (q1 == false)
  {
    text1();
  }

  button1State = digitalRead(9);
  button2State = digitalRead(8);

  if (button1State == HIGH)
  {
    question2();
  }

  if (button2State == HIGH)
  {
    question3();
  }
}

void question2()
{ 
  if (q2 == false)
  {
    text2();
  }

  button1State = digitalRead(9);
  button2State = digitalRead(8);

  if (button1State == HIGH)
  {
    question4();
  }

  if (button2State == HIGH)
  {
    question5();
  }
}

This solves the issue completely.