Надо ли лезть в startup зависит от компилятора. В IAR AVR можно и не лезть - просто нужно написать функцию low_level_init в которую программа попадёт сразу после сброса и до очиски переменных. не понятно чем плохо вызов загрузчика из main.
Чего ж непонятного? Вызываете boot_func из main, он перешивает main и всё остальное и возвращается неизвестно куда - там всё переписано. Думаю есть ещё минусы какие-либо.
Его даже можно вызвать из меню.
Вызывать можно по всякому. Безопасный способ - "из меню" сделать сброс, который перейдёт на загрузчик (сделанный отдельным проектом).