You might be able to improve the efficiency of the combinations, by forming an inclusive dfm and then applying many of the steps to the dfm, to yield the same outcome.
For instance, you can stem, lowercase, uppercase, or remove stopwords or punctuation or numbers, from a dfm after it has been formed. This would be much faster than creating a new dfm. (Although most of your time is spent fitting models, not creating the combinations of dfm objects.)