There actually is a way to do this, though you may find it to be more painful to work with.
Imagine, if you will, two environments: production and maintenance.
The production environment is the one you're running right now, for production. It fully manages everything and ensures that your systems are all fully up-to-spec. It takes about 5 minutes for a full run of this manifest.
The maintenance environment, on the other hand, manages /etc/passwd, exported resources, and a couple critical resources that change frequently. It doesn't check package versions, update /etc/ssh/ssh_known_hosts, configure backup software, etc. It's main purpose is to keep puppet running.
Once you have these two environment configured, you move the majority of your hosts from "production" to "maintenance", and your puppet runtime drops. When you make actual changes to the manifests, you temporarily move all those hosts back into the production manifest so they get applied, and then revert them to maintenance.
Another possibility for reducing overall CPU usage is to reduce the number of times a day that Puppet runs. If you cut it back to twice daily, then your total CPU usage goes from 120 minutes/host to 10 minutes/host. That is, in fact, how we run Puppet where I work, though we do that out of a culture of a "no changes during production" mindset rather than saving CPU cycles.
Finally, consider the actual reasons for your long run times. If it's primarily that you are checksumming large file trees, you may want to consider other alternatives. While Puppet is fabulous for templated files, perhaps the bulk of those files could go into a bzr/svn/git/hg/whatever repository? Then your manifest for that directory is reduced to an exec{} for creating it, and either an exec{} or perhaps a cron{} for running the appropriate update.