"while()" statement won't exit

In general using a variable to record the state of a pin tends to be a mistake.

Just read the pin directly and act on it.

while(now.hour() == 16 && now.minute() == 19)
{
    Buzz();
    if(digitalRead(button))
       break;
}

If you want to anything more advanced, call a function passing the result of digitalRead() to it,
lots of small functions with well chosen names makes for readable code.

Another way to structure code that responds to pins is using a state-machine.
Making states explicit can make code easier to read and modify.