Use momentary to trigger output for a time w/o using delay?

This is something that I would do:

unsigned long _timer1_period=0;  //timer period, in seconds
unsigned long _timer1_counter=0;  //timer1 counter
//timer1 isr
ISR(TIMER1_OVF_vect) {
  _timer1_counter+=0x10000ul;   //increment timer_counter
  if (_timer1_counter >=F_CPU) {
    _timer1_counter -= F_CPU;    //reset timer_counter
    _timer1_period -= 1;            //decrement duration_sec
    if (!_timer1_period) {        //elapsed time has been reached
      //turn off the led
      digitalWrite(LEDPin, LOW);
      TIMSK1 &=~(1<<TOIE1);      //turn off timer1 interrupt
    }
  }
}

//initialize the timer
//to expire in user-specified period of time
void tmr1_init(unsigned long duration_sec) {
  _timer1_counter = 0;            //reset timer1 counter
  _timer1_period=duration_sec;    //set timer period
  TCCR1B = 0x00;                //turn off the timer
  TCCR1A = 0x00;                //normal portion operation
  TCNT1 = 0;                    //reset the timer
  TIFR1 |= (1<<TOV1);            //clear the timer flag
  TCCR1B = 0x01;                //turn on the timer, 1:1 prescaler
  TIMSK1 |= (1<<TOIE1);        //enable the timer interrupt
  sei();                      //enable global interrupt
}

The isr keeps track of time elapsed and at the end, turns itself off. The other routine just initialize the timer. Once it is set, it goes on by itself.

Here would be your user code:

    if (buttonState==HIGH) {
      digitalWrite(LEDPin, HIGH);          //turn on the led pin
      tmr1_init(5);                       //initialize the timer to elapse in 5 seconds
    }

As the routines are set-and-forget type, your user code is greatly simplified: all it does is to set up the timer and then it moves on.