If there was s[0..5] and s[..5] there would be two different ways to do the same thing.
s[7..] is the only way to slice starting from 7 without explicitly providing the end, because the end is different based on the length of s.
For s[..5] there only ever could be 0 as start, so I think the reasoning may be, that when there is only one case, it is best to make it explicit.
Which helps with
Favor reading code over writing code.
Also if you could elide the start and the end you would get this awkward corner case: s[..]
I mostly would say that, it not needing to be optional, to implement the feature (having a start index), makes the syntax have less variance and I think that may be the primary reason, why it is like it is.
With s[3..] you can’t implement it, except if you remove the feature entirely and require people to write s[3..s.len] instead.
But if you want some more official reason, you may have to dig through a bunch of issues or the source code, where and when the syntax was implemented.
This is just me speculating.