That's intentional. The expression s[2] is asking for the character at index 2, which is not a valid character index, so it's an error. The expression s[2:2] is asking for all the characters from index 2 to 2, which is zero characters, a perfectly valid substring and answer. If you have disjoint index ranges, you will always get disjoint substrings; if the index ranges cover the entire original string, you will get the entire original string.
The only thing that would make that an error and still make sense would be making s[1:1] an illegal range and requiring that index ranges include all of the bytes of a character or none of them, requiring the substring including the first character to be written as s[1:2]. That seems pointlessly strict to me though. As it stands, you can always split a string in half without worrying about where the valid byte offsets are by writing something like s[1:k] and s[k+1:end] — it doesn't matter if k is a valid character index or not. Similarly, we allow slices like s[1:0] and 0 is never a valid character index.