Note that I am not advocating this solution - only showing that I think it is possible. I think that Kvegaoro's answer is more practical and even likely to use less power for almost all real-life use cases.
I think you could do something like this...
- Set up watchdog interrupt only mode.
- Set up the prescaller to the maximum 8s delay.
- Start the Watchdog.
- Sleep.
- Wake due to some external INT other than the Watchdog.
- Stop the Watchdog immediately upon waking.
In a loop, step though the prescaller values from highest to lowest.
d. clear the Watchdog interrupt flag
a. set the prescaler to the loop value.
b. check to see if the Watchdog interrupt flag has become set.
c. shift the bit from the previous test into a shift register.
At the end of all this, the shift register should now have the upper bits of the value inside the prescaller counter.
Note that I have not tested to see if changing the value of the prescaler will asynchronously update the value of WDIF even when the watchdog is not running, but based on this, my guess is that it does. Even if it does not, then this method can still work, you just need to create a watchdog interrupt handler that sets a flag somewhere indicating that it was called. Then just check this flag after each prescaler update to see if the interrupt fired.
If you can convince me that you have one of the unlikely use cases where this actually does make sense, then I'll spin up some code to hammer out the details!