There's three possible approaches here, since view state is the problem.
Reduce View State by Transient
Make the select-options transient, so they don't take up view state size, and are rendered purely in Visualforce. You don't even need your inputs to be part of view state as long as they're part of the form. It's trivial to reduce view state size with the judicial use of the
transient keyword. You'll want to experiment, because it does take some getting used to (e.g. you have to remember to have everything bound to an input element or re-rendered each time the page loads).
Make Client-Side UI
Render the entire UI in Angular, jQuery, or even vanilla JS. The client interacts with Visualforce only through RemoteAction functions. This is incredibly fast (usually up to 10x faster), at the cost of some complexity.
Sometimes, you can get away with making a hybrid solution, which is easily as complicated as either prior solution, but gives you more control over the size of the view state. For example, you might have the core inputs be bound to hidden elements, and then linked through two-way data binding in AngularJS such that your apex:commandLink will only affect part of the page, and AngularJS will take care of rendering UI elements that are bound by templates. I've only attempted this a few times, and the payout was always worth it, but the complexity leaves something to be desired.