It makes sense to reset the hidden state when you are working with instances or batches that are not related in any meaningful way (to make predictions) e.g. translating two different input instances in neural translation. You can think of the hidden state as limited memory that gets convoluted if the input  is too long (and it can be if you combine multiple instances) and, as end result, the final peformance may decline.
One more thing, when performing SGD, you assume batches are independent of one another. If you don’t reset the hidden state between them, you lose the i.i.d. assumption.