Several things will affect retrieval and regeneration time. Look for some of these:
Warnings messages are an indication that Pro/ENGINEER is spending time determining what you want. Just because the geometry doesn't fail doesn't mean its efficient. Look for Geom Checks and 'cut entirely outside of model' type warnings. These are computational resource drains that can be avoided in most cases.
Assembly features like cuts do add to regeneration time. Assembly features essentially create assembly-level hidden family tables. It is cumbersome to explain, so in short, it increases regen time. Assembly features especially increase regen time when they are 'entirely outside the model'.
External references also affect regeneration time. If external references are tied to components not currently in your assembly, they will either freeze the geometry in your assembly (generally a bad thing), or they will retrieve the required model(s) in the background and verify them before updating the desired component. I think this is determined by a config.pro option, but I'm not sure. Use the Global Reference Viewer Graph to see a model tree structure of your external references.
When possible, use a skeleton model. Skeletons are part of the advanced assembly option (AAX). I figure if you are creating external references, you must have access to AAX. AAX is a group of top-down design tools that make managing large assemblies faster and easier. Use skeletons to maintain external references and to assembly all your sub-assemblies. Don't copy external references into your skeletons, only use your skeleton as a reference to other components/geometry.
Use a skeleton in conjunction with your Simplified Reps. This will reduce in-session memory usage even more. Although it doesn't help regen time. Another option is to use on-demand simplified reps. You have to turn these on with a config.pro option (open_simplified_rep_by_default = yes). Then when you open an assembly, it prompts you for the rep to open. Choose Graphics Rep and fill the check box for 'Enable On-Demand Updating'. This will open another dialog asking how/when you want to swap out components. Essentially all components start out as graphics reps. As you assemble, they change to geometry reps. If you modify a feature in a comonent, it changes to a master rep. For truely large assemblies, this is a huge time and resource saver.
How you created the geometry itself can significantly affect regeneration time. Patterns of complex cuts in some cases take much longer than if you surface transformed the cut. I've reduced regeneration times by minutes before just by using surfacing. If this is an issue, please let me know and I'll provide more detail.
You are doing the right thing by using lots of sub-assemblies. Sub-assemblies allow you to break a large assembly into manageable chuncks. Most of the time you can work on an individual sub-assembly and not have to wait on the full assembly to open or regenerate. This is a great top-down design technique.
Good Luck