Ну ход примерно такой, modules.define сохраняет имя, зависимости и declarationFunction в какую-нибудь внутреннюю коллекцию в качестве геттера. Например, в modules.cache. Когда происходит require, происходит обращение к modules.cache по имени. Геттер должен сработать, получить результат и перезаписать себя на результат выполнения provide — так будет реализована отложенная инициализация