Unless I'm mistaken, the reason why this doesn't work is that Solve and Reduce do not have an Assumptions option, so Assuming has no effect on them.
Using Reduce
We can tell Reduce that these variables are all real-valued like this:
Reduce[a + I b == zr + I zi && Element[{a, b, zr, zi}, Reals], zi]
(* ==> (zr | b) \[Element] Reals && a == zr && zi == b *)
Using Solve
There's a note in the documentation:
Solve[expr && vars \[Element] Reals, vars, Complexes] solves for real values
of variables, but function values are allowed to be complex.
However, Solve[a + I b == zr + I zi && (a | b | zr | zi) \[Element] Reals, zi, Complexes] returns {} which means that there are no solutions. Why does this happen? zi has a real value only if a == zr, so in general (for arbitrary a, zr values) there is no real solution for zi. The main difference between Reduce and Solve is that Reduce will try to generate those specific conditions under which a solution exists while Solve does not.
Why doesn't Assuming work?
Generally, Assuming works by setting $Assumptions temporarily:
In[1]:= $Assumptions
Out[1]= True
In[2]:= Assuming[x > 0, $Assumptions]
Out[2]= x > 0
It will have an effect on functions that have an Assumptions option. These functions have Assumptions -> $Assumptions as a default setting:
In[3]:= Options[Integrate]
Out[3]= {Assumptions :> $Assumptions, GenerateConditions -> Automatic,
PrincipalValue -> False}
In[4]:= Options[Simplify]
Out[4]= {Assumptions :> $Assumptions, ComplexityFunction -> Automatic,
ExcludedForms -> {}, TimeConstraint -> 300,
TransformationFunctions -> Automatic, Trig -> True}
It will not have an effect on functions that do not have this option:
In[5]:= Options[Solve]
Out[5]= {Cubics -> True, GeneratedParameters -> C,
InverseFunctions -> Automatic, MaxExtraConditions -> 0,
Method -> Automatic, Modulus -> 0, Quartics -> True,
VerifySolutions -> Automatic, WorkingPrecision -> \[Infinity]}
In[6]:= Options[Reduce]
Out[6]= {Backsubstitution -> False, Cubics -> False,
GeneratedParameters -> C, Method -> Automatic, Modulus -> 0,
Quartics -> False, WorkingPrecision -> \[Infinity]}
I could imagine though that Solve or Reduce make internal use of some function that does take $Assumptions into account. I do not know if this is the case or not, but I doubt that generally $Assumptions would have an effect on them.