There are different ways to reason about this; you may argue with the guarded actions or with the SOS semantics which is the intention of the exercise. Let's first consider the guarded action approach: The program has the following guarded actions:
o1&!o2&st => o1 = true
i&o1&!o1&st => o2 = true
o1&i&l&!o1 => o2 = true
At starting time, we have st=1 and l=0, so that we get the following reduction:
o1&!o2 => o1 = true
i&o1&!o1 => o2 = true
0 => o2 = true
For input i=0, we moreover get
o1&!o2 => o1 = true
0 => o2 = true
0 => o2 = true
Now, we evaluate the guards with E(o1)=E(o2)=⊥, and obtain
⊥ => o1 = true
0 => o2 = true
0 => o2 = true
Hence, whether o1=true may be fired or not is not clear at this point of time. This action is in the CAN set, but not in the MUST set, and we can therefore not change the value of o1. Moreover, no action on o2 can be fired, so that the reaction to absence determines the value of o2, and thus o2=0, and thus !o2=1, and we then get
o1 => o1 = true
0 => o2 = true
0 => o2 = true
Thus, the value of o1 cannot be determined.
The approach using the SOS reaction rules computes for E(o1)=⊥ and E(o2)=0 at first for "if(!o2) emit(o1);" the actions Dmust=Dcan={emit(o1)} and this is also obtained for the entire body of the immediate abort statement. However, then we have to consider the SOS rules for the strong immediate abort statement "immediate abort S when(!o1);". Since the abort condition is ⊥, it will empty the must set and will leave the can set as it is. Hence, emit(o1) remains in the can set, but is removed from the must set. Again, we cannot make further progress from here.