Если в последнем случае написать
CharLower(Pointer(s))
то ошибки не будет: в этом случае Delphi передаст не указатель на константный символ #00, а именно 0, как адрес строки. А согласно MSDN, если аргумент CharLower меньше $FFFF (в данном случае 0), то она считает аргумент одним символом, результат преобразования которого и возвратит (не запишет по адресу, так как был передан не адрес, а код символа):
s := Char(CharLower(Pointer(65)));