There is no tanh() applied to updated hidden state.

If you use nn.RNN(), it uses tanh() as a default activation function even if it is not specified by the user.

Output state is from combined vector instead of updated hidden state.

I guess the tutorial is incorrect in terms of its implementation where the output and the new hidden state are different because they are derived from independent weights(i2h, i2o).  As you can see in the code snippet below, the result of hidden state and the last sequence output should be the same
import torch.nn as nn
rnn = nn.RNN(10, 10, batch_first=True)

inp = torch.randn((1,3,10))

result = rnn(inp)

print(result[0][0])
print(result[1])

which has the same result of
tensor([[[-0.0253,  0.5289, -0.2582, -0.5125, -0.4577,  0.5456, -0.4042,
          -0.6476, -0.4210, -0.5473]]], grad_fn=<StackBackward>)