First issue in your question:
# WRONG!
(reconstLoss +outLoss.item()).backward()

# Correct
(reconstLoss +outLoss).backward()

x.item() returns it as a Python number, which means, your operations on the return of x.item() no longer come under the visibility of PyTorch. It’s pretty much like doing (reconstLoss + 50).backward(), i.e. adding a constant.
Now that we’ve gotten that out of the way, to answer your second question:
(reconstLoss + outLoss1).backward() will backprop reconstLoss gradients through everything that created it, and outLoss1 through everything that created it.
They get independently backpropped, because dL/dx(f(x) + f(y)) = dL/dx(f(x)) and dL/dy(f(x) + f(y)) = dL/dy(f(y)) i.e. the gradients between x and y here dont have any dependent terms because of the addition operation.
On the other hand, if you did x * y, then the gradients going back through the path of x will have a scaling factor of y, and the gradients going back through the path of y will have a scaling factor of x.