В моем понимании s[0..] вызывает метод ops::Index::index. Я пытаюсь вызвать s.index(0..), но обнаруживаю, что он возвращает тип &str. Код выглядит следующим образом
let a = String::from("hello world");
let b = &a;
let c = b.index(1..);
println!("{}", c);
let d = b[1..];
println!("{}", d);
Этот код отобразит ошибку и укажет, что переменная d имеет тип str.
Что я неправильно понимаю? и как понять [] и index() в ржавчине?

В документации std::ops::Index находим:
container[index]на самом деле синтаксический сахар для*container.index(index)
и
Это позволяет делать такие приятные вещи, как
let value = v[index], если типvalueреализуетCopy.
В вашем примере c имеет тип &str, как вы ожидаете, но d будет разыменованием (*) такого &str; это приведет к str, который отклоняется компилятором (не по размеру).
Чтобы получить &str в d, вы можете написать:
let d = &b[1..]; // & was missing
что действительно явно, потому что ясно сказано: «Я хочу сослаться на что-то, что стоит внутри b».
Вот еще один пример неявного разыменования (*) в другом контексте:
let mut arr = [1, 2, 3, 4];
let n = arr[1]; // not *arr[1]
arr[2] += n; // not *arr[2]
println!("{:?}", arr); // [1, 2, 5, 4]
что еще вы хотите, чтобы он вернулся?