I'm not sure of the logic of your design.
If your Alarm clock has no battery then obviously it won't work if not plugged into a USB port (be that a USB power supply or a computer port).
(I hope in your design your are allowing for the fact the NodeMCU is 3.3 V only)
So unplugged it is OFF, plugged in ....why does the ESP8266 ever need to sleep?
What advantage do you gain having the MCU go to sleep when power is available?
To answer your question more directly.
If you want to implement one of the deep sleep modes, there are dozens of sample code projects (Arduino and NodeMCU) where you use an internal timer (or a pin change interrupt) in the MCU to wake from deep sleep after a timed period (set by the MCU).
In your case you could simply have the MCU power up say every 55 seconds and compare an alarm value kept in the MCU with the RTC time from the DS3231. If the time is not close to the alarm time (by more than 1 minute) then reactivate the timer and go back to sleep.
You can leave the DS3231 programmed to a fixed reference time zone in 24 hr mode and do everything else in the MCU.
This avoids having to change (add to) the RTCLib to allow setting the alarm registers in the external DS 3231. There is little difference between using SQW to trigger a Pin change to wake up the MCU and using an MCU timer to wake the MCU.
Side Note: The RTClib already supports setting the SQW to 1 Hz, so another way to implement would be to input this to a timer in the MCU and set a wake on timer (number of seconds) as the alarm.
If you keep the alarms in the MCU then you have the potential to create multiple, complex day (12/24hr) and time zone relationship alarms easier (in terms of software) than if you try to program only the two DS3231 alarm registers.
If you want to truly write your own code, then use the Wire library directly to address the DS3231 registers and simply fork the Adafruit libray, adding your functionality to the library.