Just like an interface wouldn't look up the PIPoint each time it receives data for it, an application using PIModule's needs to cache the modules it uses. Load them once at start up and then access them from local memory. You can store cached modules in PIModuleList's (look up by Unique ID), NamedValues collection (look up by unique string) or any VB or C++ collection (flexible).
Now that Module Events are working, caching is more efficient. You can sign up for changes to PIModules and refresh the ones that have changed by exception.