I already assume that there’s a really trivial solution to this, but I just can’t figure it out and also couldn’t find anybody else writing about this - why is
The first argument of ReplaceAll is evaluated before the replacement rule acts. The difference between the two cases is that evaluating Sin[x] just returns Sin[x], unchanged. So Sin is still visible to the replacement rule. But evaluating A[x] returns 2 x, so A is no longer visible to the rule.