index_select does propagate back:
x = Variable(torch.ones(3), requires_grad=True)
ixs = Variable(torch.LongTensor([1,]))
y = x.index_select(0, ixs)
z = y.mean()
z.backward()
x.grad

> Variable containing:
>  0
>  1
>  0
> [torch.FloatTensor of size 3]

It seems to be the same for clone
x_original = Variable(torch.ones(3), requires_grad=True)
x = x_original.clone()
ixs = Variable(torch.LongTensor([1,]))
y = x.index_select(0, ixs)
z = y.mean()
z.backward()
x_original.grad

> Variable containing:
>  0
>  1
>  0
> [torch.FloatTensor of size 3]

while x.grad is None gives True in this case