Дескриптор у слайса имеет такую структуру:
type SliceHeader struct {
Pointer uintptr
Len int
Cap int
}
len(...) - это ключевое слово языка и в контексте компилятора не является функцией, вместо которой он может подставить что угодно.
Выше мы выяснили, что у слайса есть поле с длиной, соответственно нет смысла кешировать длину в отдельной переменной. Т.к. компилятор просто заменит вызов len на обращение к полю в дескрипторе слайса. Он вообще может переместить длину в регистр процессора и не обращаться к ram при итерации.
Если нужно экономить ресурсы, то лучше подумайте о неявной проверке на выход за границы массива, которая в некоторых случая может сожрать нехилую часть процессорного времени. Подробнее прочитать можно в
этой статье.