This is "ascending" sub-query operator syntax. It operates on the entire row to produce a new row with the specified keys and values as the operator applied to the row.
However, the operators in the sub-query are strings so Query employs some syntax sugar to reduce the amount of code needed to be written.
So for
"A" -> "a"
Query's syntax sugar "interprets" the operator not as "a" but as
GeneralUtilities`Slice["a"]
This is an internal function that when applied to the row the value associated with key "a" is returned.
GeneralUtilities`Slice["a"]@<|"a" -> 1, "b" -> "x", "c" -> {1}|>
1
This results in the keys being renamed in the association returned.
This is less verbose and some would say easier to read (once you know about the syntax sugar) than the alternative. For example
Query[All, <|"A" -> #"a", "B" -> #"b", "C" -> #"c"|>&]
Also because &'s operator precedence means that additional brackets often need to be included to prevent it from capturing the additional expressions when chaining operators together in Query with /*.
Note that you can always view what Query will do with Normal. Although it does not always return standard Wolfram Language functions; current case in point.
Query[All, <|"A" -> "a", "B" -> "b", "C" -> "c"|>] // Normal
Map[
GeneralUtilities`ApplyThrough[
<|
"A" -> GeneralUtilities`Slice["a"],
"B" -> GeneralUtilities`Slice["b"],
"C" -> GeneralUtilities`Slice["c"]
|>
]]
Hope this helps.