After looking at the docs I saw that the output is always time-major as you said. I wrote this test to confirm that this was what was going on
gru_bf = nn.GRU(input_size=512,
             hidden_size=1024,
             num_layers=1,
             batch_first=True,
             bidirectional=False)

gru = nn.GRU(input_size=512,
             hidden_size=1024,
             num_layers=1,
             batch_first=False,
             bidirectional=False)

batch = 1
seq = 100
input_size = 512

in_bf = torch.randn(batch, seq, input_size)
input = torch.randn(seq, batch, input_size)

out_bf,_ = gru_bf(in_bf)
out, _ = gru(input)

print(out_bf.shape)
print(out.shape)

The output is:
torch.Size([1, 100, 1024])
torch.Size([100, 1, 1024])

It seems that if batch_first is true the output will also have batch first. Is this indeed the case or am I misinterpreting the output.
Thank you for your help I really appreciate it.