I wanted to know the answer to the question as asked, even though it wasn't the true issue, so I did a quick experiment.
For background, my Dev Hub is a standard Developer Edition for working on personal and open source Salesforce DX projects. It's far, far easier to hit limits in a Developer Edition, where the Daily Scratch Org limit is 6 and the Active Scratch Org limit is just 3. In particular, running CI jobs that spawn and delete scratch orgs will devour the daily limit in, well, six pushes or fewer per day.
I recorded my limits as of 6 pm on 12/27:
$ sfdx force:limits:api:display -u [email protected]
NAME REMAINING MAXIMUM
──────────────────────────────────── ───────── ─────────
ActiveScratchOrgs 1 3
DailyScratchOrgs 6 6
Then created and deleted a new scratch org, validating that DailyScratchOrgs
ticks to 5 after the operation.
At 8 am the following day:
$ sfdx force:limits:api:display -u [email protected]
NAME REMAINING MAXIMUM
──────────────────────────────────── ───────── ─────────
ActiveScratchOrgs 1 3
DailyScratchOrgs 5 6
so the limit does not reset at midnight EST.
At 7 pm the following day, 12/28, the limit has reset.
$ sfdx force:limits:api:display -u [email protected]
NAME REMAINING MAXIMUM
──────────────────────────────────── ───────── ─────────
ActiveScratchOrgs 1 3
DailyScratchOrgs 6 6
So, daily scratch orgs is indeed a rolling 24 hour window. (Note that one active scratch org was created before and lived through this two-day observation period).