Hard to tell what is happening exactly. Maybe when all clients try to reconnect, Openfire is still having their old sessions in memory and starts to clean them up. When users login in the morning, there are no old sessions hanging on the server, so it may handle them easier. This is on a guess. Also, in the morning you users probably still not launching their PC simultaneously and there are logging in in batches, not all at once. In this case when all clients start to reconnect almost simultaneously it creates a heavier load.
Are you using Spark as a client. I have just tested and it seems it is using static intervals for reconnection. So if all clients lose connection at one time, they will try to reconnect at the same time. You may want to find a client which is doing reconnects at a random intervals. This way all clients won't try to connect simultaneously.
Another thing, which i'm not sure will work, is to use Connection Managers, so they would handle the connections, lifting this load from the main Openfire server https://igniterealtime.org/projects/openfire/connection_manager.jsp
But then you will probably face the problem that Connection Manager will get the high load. Though, as it is only managing the connections, maybe it will be able to handle large number of connections better.