Which timer library to use for several seconds of delay

Can you create a function inside of loop() & reference that function within loop()?

Yes you can. No matter where you are the value of millis() returned comes from the same place.

Turns out it stops the program just like a delay()

Only if you are (locally) looping to wait for the time to expire in the loop, which is what you are doing. Then you may as well use delay().

To state the obvious, your code:

  while(!exitThis){
    if(millis() >= (timeStart + duration)){
      digitalWrite(pin, HIGH);
      exitThis = true;
    } // end if
  } // end while()

needs to change to this:

    if(millis() >= (timeStart + duration)){
      digitalWrite(pin, HIGH);
    } // end if

The while statement blocks you so that you cannot do anything else. The whole while with millis() thing is just like delay().

The structure of your code looks like it could benefit from you getting familiar with Finite State Machines, as your application seems to be based on doing a sequence of things followed by waiting for an external input that changes the current state and what needs to be 'done' before moving to a new state. The easiest way to implement these are with case statements and you should be able to reuse a lot of your existing code. Google the term or search these forums as there is always a lot of discussion on FSM.

Edit:
Here is a link by majenko http://hacking.majenko.co.uk/finite-state-machine