Opa, blz Luiz? Compartilho da sua dúvida também, mas vamos lá, vou tentar explicar o pouco que sei e vamos trocando umas experiências.
Pelo que parece (e o pouco que já pesquisei) o response sempre é uma grande string contendo tudo que a página enviou para o servidor, mesmo que enviássemos o objeto, ele precisaria ser representado como uma string. Desta forma, passamos o ID e recuperamos no servidor novamente por não ter muita opção (não estou certo disso). Porém, tem como melhorar a escrita disso tudo e centralizar essa "recuperação" dentro de um converter e usarmos o converter na pagina sempre que precisarmos mandar o objeto, algo assim:
<h:selectOneMenu value="#{myBean.selectedItem}">
<f:selectItems value="#{myBean.selectItems}" var="foo" itemLabel="#{foo.name}" itemValue="#{foo}"/>
<f:converter converterId="fooConverter" />
</h:selectOneMenu>
<h:commandButton value="enviar" action="#{myBean.action}" />
esse converter vai anotado no faces-config e pode ser utilizado em qualquer pagina simplesmente citando o seu converterId.
Usei isso em diversos lugares já, onde no meu esquema criei um serviço genérico que usa reflections para decidir o que carregar baseado no ID e retornar, desta forma, tenho um único converter para qualquer bean que seja um @Entity do JPA.
Minha principal fonte é essa: Faces.Converter
Dá uma olha no link que tem todos os códigos java e xml para fazer isso ai funcionar OK (caso ainda não conhecesse o lance de converter)
Como mencionei, compartilho da sua dúvida, mas atualmente resolvo-a assim :D