За один шаг - никак. Потому что это две операции.
x = l[:][1]
# это то же самое, что и
tmp = l[:] # l.__getitem__(slice(None, None, None))
x = tmp[1] # tmp.__getitem__(1)
У тебя есть два выхода. Либо ты первым __getitem__ возвращаешь какой-то специальный промежуточный объект, который уже своим __getitem__ принимает 1 и выполняет нужное действие.
Либо ты меняешь способ обращения к объекту на кортеж:
x = l[:, 1]
Тогда у тебя __getitem__ получит кортеж из двух элементов:
(slice(None, None, None), 1)