I've noticed that JSF checks the value in the posted form versus the selectItems on the server side. So if for example :
Say for example that stateItems returns as the list of Mexican states. Then through Ajax I change that list to US states. JSF will once again rebuild stateItems, realize that the posted state ID isn't in the select list and create a validation error. You have to tell your managed bean that the list changed too.
So what I do is use the verbatim tag to place a facade HTML code on the page with some javascript that copies those values to a hidden field. I have a state select which isn't linked to any JSF component and a hidden field with the state value. On page load the list is populated with the state values and the hidden state value is set. The user can work all he wants with Ajax. On submit the select value is copied to the hidden field and posted.
It isn't real JSF / AJAX integration, but it has two benefits. One it is simple. Two it lets me
test AJAX independent of JSF. Kinda like a view inside a view. Once your done working with those values, they get copied to the hidden fields and posted.