BalancE the UppercasE
JavaScript (Node.js),  76  72 bytes
Saved 2 bytes thanks to @tsh

s=&gt;s.replace(/[a-z]+/gi,w=&gt;Buffer(w).map((c,i,a)=&gt;c&amp;=a[w.length+~i]|95))

Try it online!
Commented
s =&gt;                     // s = input string
s.replace(               // replace in s:
  /[a-z]+/gi,            //   match all words in a case-insensitive way
  w =&gt;                   //   for each word w:
    Buffer(w)            //     turn it into a Buffer
    .map((c, i, a) =&gt;    //     for each character c at position i in this array a[]:
      c &amp;=               //       bitwise AND of c with:
        a[w.length + ~i] //         the counterpart character taken from the end of
                         //         the word
        | 95             //         OR 0b1011111
                         ///        (all letter bits except the lowercase bit)
    )                    //     end of map()
                         //     implicit coercion of the Buffer to a string
)                        // end of replace()