You can get rid of the for loop by using arrayfun to apply a specific function on all elements of the inputs. However, I'm not sure if it will be much faster than the loopy version.
The code below produces output equivalent to your original cell array L:
L2 = arrayfun(@(x,y)q(x:y), From, To, 'UniformOutput', false);
Here, @(x,y)q(x:y) defines an anonymous function that returns subvectors from q according to the inputs x and y, which are picked by arrayfun from your input vectors From and To.
As suggested in the comments, if you desire extra genericity you can specify another function handle like this:
L_fun = @(q)arrayfun(@(x,y)q(x:y), From, To, 'uniformoutput', false);
...and then call it for an arbitrary vector (not necessarily your original q) as such:
q2 = rand(10,1); %// Random vector for testing
Lout = L_fun(q2); %// Use From and To to pick from q2
Or even define a handle which takes all inputs:
L_fun = @(q,From,To)arrayfun(@(x,y)q(x:y), From, To, 'uniformoutput', false);
but in this case it might be better to actually write a named function already.