The min. achievable loss value depends on your setup, but in the default setup a theoretical zero loss could be reached. In practical use cases you would come clone to a zero value, but would most likely never reach it perfectly due to e.g. the limited precision using floating point values (i.e. the gradient updates might never update the parameters to the “perfect” parameter set).
If you only train with positive labels, your model would most likely learn to only predict these positive labels, which would explain why the outputs are always ones.
I’m not familiar with your use case so you would need to check, if nn.BCEWithLogitsLoss is the right loss function for it. It’s usually used for a binary or multi-label classification.