1. Компилятор схлопывает выражения типа s2 для экономии ресурсов проца. По сути вычислять каждый раз не надо, это костанта
2. У компилятора есть настройка, при которой при создании новой строки он будет искать идентичную ей в памяти, если найдет, то вернет эту же ссылку в s3
3. При отработке s1 компилятор не может схлопнуть строку, по этому на уровне il кода генерится логика, и далее при ее инициализации просто создается новая строка независимо от памяти
4. При приведении стринки к объекту оператор == будет сравнивать ссылки, а не сами объекты. А так, как s2 и s3 имеют одну и туже ссылку, то и выходит всегда true