If you rewrite the code to be a state machine so that loop() never blocks it's pretty easy to add:
bool paused = false;
void loop(){
//read button
if(buttonPressed){
paused = !paused;
}
if(paused){
return;
}
//rest of code written so it never blocks and returns as fast as possible
}
Then the resume part is handled by the extra already required by needing to be able resume on next call of loop.
If you go for full power off then you need to write out your state to non-volatile memory and read it back in on init.