It's a constant.
You're right that it is a constant but... when the compiler sees S[1] it wants that expression to be an address. As a result, it creates a three character string in the data segment which is something it can take the address of. You can see it if you hexdump the exe or if you look at the assembly code any reference to S[1] generates (you'll see an address, not a character.)
To see that in action in the source, declare a variable "p : pointer;" then add a statement "p := @S[1]". if the compiler saw S strictly as a compile time constant it would not allow taking the address of any of its elements but, it does, which proves that even though you declared it as a constant, the compiler allocated memory for it, which means it's no longer a compile time constant, it's a memory constant (somewhat like a typed constant when writeableconst is off.)
const
S = 'abc';
C = S[ 1 ]; // <<-- Illegal expression
Why is S[ 1 ] not considered a constant expression though S is a constant?
because the expression S[1] could also be S[somevariable] which can only be calculated at runtime. As a result, the compiler takes the "safe route", it puts the constant into memory, that way it can be accessed when the value of "somevariable" is determined. Once it places into memory, it is no longer a compiler constant, it's a memory constant and those need to be accessed using an address, therefore the "S[1]" cannot be used in a constant expression since the address of S[1] is not known at compile time. (
edit: actually, the address of S[1] is known at compile time but, if it were the address of S[v] it wouldn't be. To account for that case, the compiler plays it "safe" and sees S[1] as if it were S[v].)
Strictly speaking, if the compiler was really smart, it would see that S[aconstantindex] is also a constant and would simply choose the right character at compile time but, it's not that smart. It plays it safe instead.
Your last example is a typed constant, which isn't really a constant, it's a static variable which is why you can change the value of "a" to "b".