So first I want to know if its possible to run two OS having different execution state on the same exception level? If yes how does the hypersior code running on EL2 switch between them?
Short answer - yes. You can have multiple virtual machines (VMs) running, with a Hypervisor switching between. The VMs run in non-secure EL0/EL1, and the Hypervisor in EL2.
You can have both AArch32 and AArch64 VMs hosted by the same Hypervisor - as long as the Hypervisor is AArch64.
Is it that on getting an exception when the processing engine (PE) enter EL2, the hypervisor code needs to save the SPSR_EL2, ELR_EL2 and PSTATE for one OS to a stack and then when returning from EL2, modify these registers including PSTATE.nRW bits to change the execution state (corresponding to AArch66 or AArch32) so that it enters the execution context of other OS?
Pretty much. The Hypervisor has to save off the context of the current VM, and load the context of the VM it now wants to run. Where "context" means all the EL1 system registers, general purpose registers, floating point/SIMD registers, EL2 virtualisation settings...... It's not really that different to an OS switching between an AArch32 and AArch64 app - just that there's more context that needs saving/restoring.