I have an easy way to kind of do what you want, but you would have to put any code you want in alarms into scripts/functions. You could actually create a generic object that has a simple alarm event, and then put a script_execute(scripttoexecute) call in the alarm, along with destroying itself afterwards. Then, your object creates an instance of the object using either obj = instance_create(xxxx) or with(instance_create(xxxx)){}, then you can use either the dot syntax or put within the brackets of the with{} the alarm[0] = somestepamount, and put scripttoexecute = somescript.....then the other object gets released to handle the alarm and execute whatever script it is that you set for it.
It isn't the best way to do it, but you could wrap the instance creation in your own script with a couple of arguments and that would make it a one-liner for whenever you needed some delayed code.
That said, this method once implemented is going to make one-liners everywhere instead of counting down variables...but you do have to implement it first(may take 10 minutes tops I would think). It does also increase a little overhead with having the objects out there...and you wouldn't be able to easily change those alarms or stop them without some additional workings, so simply doing a countdown variable in your step event could be the best way to go if any of that is an issue.