Eventuell zählt die Zeit, die require() benötigt, gar nicht zu den
besagten 15ms. Während der Abarbeitung des require()-Aufrufs läuft ja
streng genommen nicht Dein Programmcode, sondern der des
LUA-Interpreters; möglich, dass der sich automatisch um die kritischen
Dinge kümmert, die alle paar Millisekunden durchgeführt werden müssen.
Als ich mit NodeMCU LUA gearbeitet habe (ist mittlerweile aber schon
eine Zeitlang her), habe ich Module bzw. require() jedenfalls exzessiv
verwendet, jede noch so kleine Funktion etc. in ein eigenes Modul,
dennoch bekam ich in der Praxis kein einziges Mal Probleme aufgrund
dieser 15ms.
Falls sich das bei Dir tatsächlich als Problem herausstellen sollte,
könntest Du evtl. aber auch versuchen, einfach alle benötigten Module
gleich zu Beginn der init.lua per require() zu laden. Zu diesem
Zeitpunkt dürften die zeitkritischen Sachen wie WiFi noch nicht laufen,
weil Du WiFi ja erst einmal aktivieren musst.
Wenn die benötigten Module nach dem ersten require()-Aufruf dann erst
einmal im Modul-Cache sind, sollten spätere require()-Aufrufe für
bereits im Modul-Cache vorhandene Module quasi keine Zeit benötigen.