Its not that much less efficient. Consider that with DataLoader you still have to use a loop as it creates and iterable.
so it would still look like:
for i in number epochs:
    for j, dat in enumerate(DataLoader):
        data = dat[0]
        target = data[1]
        #all the other training stuff

I also think the reason DataLoader isn’t necessary in this case is that you are simply doing batch size 1. That is why it doesn’t work.
Batch is a third dimension that you are adding to your data to group things together, in your case multiple people.
In the particular example you provided your subject 0 has data with sequence_length = 2 and input size = 2 (as you have x, y coordinates). I’m assuming the y isn’t your target data.
For example, if you are feeding data to an RNN or LSTM with batch_first = True. The data should have the following format:
[batch_size, seq_length, input_size]
The shape of your input data for subject 0 would be  [1, 2, 2] and the shape for subject 1 would be [1, 1, 2]. As you can see batch size = 1.
I think you confused your sequence length (number of instances per person) with batch size. The same thing happened to me when I began with PyTorch.
Just remember each your people is a 2D matrix of shape (instances, a point). batch size is the number of 2D matrices you give to your model before performing gradient descent.