No. That would block and be no better than the delay() version
You could use if/else:
void loop()
{
Serial.println((millis() / 1000) % 60);
static unsigned long timer = 0;
unsigned long elapsedTime = millis() - timer;
if (elapsedTime < 10000ul) // between 0 and 10 sec do:
blink(50, 0, 2000);
else if (elapsedTime < 30000ul) // between 10 and 30 sec do:
blink(50, 100, 3000);
else if (elapsedTime < 45000ul) // between 30 and 45 sec do:
blink(50, 500, 1000);
else if (elapsedTime < 60000ul) // between 45 and 60 sec do:
blink(50, 100, 2000);
else
timer = millis(); // At 60 seconds, restart the timer
}