Even complex forms are essentially made up of 'simple' parts combined together, so you really need to consider where the complexity comes from and how best to manage it within the constraints. These would generally fall under the category of information architecture and content design that is supported by the user interface design, rather than using UI to address underlying IA issues.
The two main things I can think of are the complexity of the process and the complexity of the content, which I will cover separately:
Process complexity
- For linear processes (i.e. you can only move one step/section at a time) you can manage the complexity by keeping the user flow linear and helping them to skip to sections that they don't need to complete (if there is some conditional logic available). By the sounds of it this doesn't apply in your case. You can also provide a progress tracker if you feel like it will provide a good visual indicator.
- For non-linear processes you should still try to organize the content into logical sections, but instead of a progress tracker you can use a checklist style menu that shows the number of sections completed. Instead of allowing users to navigate within each step/section, you should point them back to the checklist as a central and consistent point of navigation.
Content complexity
When the density and volume of content is greater than the optimal level that the user can process efficiently, the best option is to break things down into smaller 'chunks'. There are various guidelines on the amount of information (e.g. characters/words per line, lines per paragraph, etc.) but these can be language or content dependent and you have to adjust this for the audience.
When the type of content is very complex (e.g. complex charts or visualizations) you can also apply the same strategy to break the information down into simpler elements or provide additional content to support the explanation of the content.
So you should be able to see that in general complexity arises from combining smaller elements in ways that still maintain the logic and structure of the overall process/content. That way, even if you have to try and deal with something that is very complex, it still allows the designer and user a sensible way to manage it all.