Вариант 1, правильный:
Никаких внутренних бесконечных циклов. Каждая функция является задачей и вызывается периодически (каждые 100 мс или сколько вам нужно), выполняет один цикл и завершается. В этом случае запуском/остановкой задачи можно управлять кнопками, опрашиваемыми в loop(); Управление задачами описано здесь
Вариант 2, костыльный:
Отслеживание кнопок выносится в отдельную функцию, которая вызывается не только в loop(), но и в каждой из функций в ее бесконечном цикле и, соответственно, позволяет не терять управление