Suspect a bug in 1.8.1 -- unless... :)

Ubuntu 14.04-LTS, Acer i5, Arduino 1.8.1 The non-blocking code take from the Digital Example for Blink no delay.

With "good" defined I get
Start
Stat = 3
Stat = 2
Stat = 1
Stop

REM out "good" I get
Start
Stop

bool Err = false;
int procDelay = 3000;
unsigned long prevMillis = 0;

void showStatus(int mins) {
  Serial.print(" Stat = ");
  Serial.println(mins);
}

#define good
void procWait(int mins) {
  for (int i = mins; i > 0; i--) {
  #ifdef good
    showStatus(i);
    delay(procDelay);
  #else
    unsigned long currMillis = millis();
    if (currMillis - prevMillis > procDelay) {
      prevMillis = millis();
      showStatus(i);
    }
  #endif    
  }
}

void progTest(int mins) {
  if ((mins > 0) && (!Err)) {
    procWait(mins);
  }
}

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("Start");
  progTest(3);
  Serial.println("Stop");
}

void loop() {
  // put your main code here, to run repeatedly:

}

So?

Mark

Unless code completes within 3 seconds and

    if (currMillis - prevMillis > procDelay) never evaluates to true and showstatus isn't called.