This recursion is a symptom of a more general design problem. You could certainly try to solve it by "leaking" the instance reference from within the constructor or defer "construction" to some initialization method you call later (possibly lazily), but I would not recommend this1.
Why does the GUI and the Player class have to be singletons and have to know about each other and more specifically, have to know each other during construction? Is there a reason other than 'It's more convenient' to have global access to some object? Not that convenience is unimportant, but it should usually not be the only reason for a design decision.
A better approach would be to get rid of the singletons althogether, because there is no real reason that there cannot be two instances of a Player and a GUI at the same time. Of course, you will probably only have one of each in your program, but that is not the purpose of Singletons.
Also, you should have the dependency only in one direction. Try to think about what can exist without the other and what cannot. I would think the GUI should depend on the Player, as you probably could imagine having a Player without a GUI, but a GUI without a Player makes no sense at all. So you first construct a Player and then construct a GUI and pass it the Player instance it operates on. If you think you need access to your GUI instance from everywhere inside the Player, you should rethink you design and try to make those objects more independent. This usually can be done by using the Observer pattern and let the GUI listen for changes/actions/stuff that happen. This way, your application code does not know about the GUI at all. However, within you GUI, you can pass around the instance of the GUI as much as you like.
Regarding the idea of introducing a 'Manager' object or the Factory pattern: it might be useful, but you can certainly do all of what I said above without that and still have a sane design. I generally would adivse against 'Manager' classes, as they tend to do too many things and are typically kind of a Singleton in disguise. Factories, however, can be useful, but only if you want to decouple actual construction of things from their usage, for example to allow different types of GUIs to be implemented later.
So a simple implementation would look like this:
public static void main(...) {
Player player = new Player();
// maybe some other stuff to configure/set up the player
GUI gui = new GUI(player);
gui.show(); // or something similar
}
If you wanted to use factories, you could of course replace the new ...
expressions with calls to the factories you would have to obtain before.
1 Why? Well, for example what would happen if you construct the GUI successfully, but later on fail to initialize it, e.g. an exception is thrown? You would need some way to communicate this 'invalid' state to all objects which already obtained the GUI instance. Also, you would have to make sure nobody uses the GUI instance before it is initialized.