No. In basic Arduino-style coding, the vast majority of the work should be done in the loop() function. BUT .... that doesn't mean loop() should take a long time to execute. It should run hundreds or (depending on the processor) thousands of times per second. For that to happen, you have to learn non-blocking coding techniques where you break long tasks into smaller chunks that just do a little bit each time the loop() function runs. And, to do periodic tasks based on so-called "millis() timing" ... an internet search on that term will yield lots of information.
A major problem is the "Arduino Method" of breaking large projects into separate .ino files. I won't go into the issues it causes here, I'll just say it doesn't provide true modularity for your code. If you're interested in a much better technique for creating modularity in large programs, take a look at My Post #5 in this Thread.
The general advise is that Arduino newbies shouldn't jump in and attempt to use interrupts. They cause more trouble than their worth in the form of unexpected problems. You already got bit with one of those and I see two more lurking in the latest code you posted that will come back and cause you problems.
Your code is a perfect of example of the unnecessary use of interrupts. You detect the button press and set a flag in the ISR to be picked up in the loop() function. That is a good technique in general for handling very quick, short events, but pointless for handling button presses which occur on a human (not microsecond) timescale. It would be just as effective (and a lot less prone to errors) if you just did a digitalRead() in the loop() function.
I suspected that. It means that your code was executing a very long task while interrupts were disabled and the Watchdog Timer expired, triggering a processor reset. That's a consequence of the functions you were calling in the updateValue() function.