Why do you want to use interrupts? To accomplish this task without interrupts would take 5 lines of code.
wait for high on some input
wait 1 ms
output high on some output
wait 1 ms
5 . output low on that output
In any case you do not want to put steps 2-5 in an interrupt routine. Interrupt routines should accomplish only what they absolutely need to do, without delays and exit as quickly as possible.
The input capture interrupt must also messure the time period between rising edges. This is used to calculate rpm. Accurate timing is needed as the edge is also used to control fuel injector timing and pulse width. As this is part of a much bigger project, there is a lot going on in the main loop now, and the reading of the edge could be delayed.
Then, the input capture interrupt routine should set a global flag that tells the main loop to execute the response.
It would be quite complicated to use a timer to output one cycle of a square wave and then stop. I can’t think of a way to do it that doesn’t involve either wait loops, two timers or external logic circuitry.
Let’s say you start with a long period count stored in a (global) variable. As I presume the timerclock is counting much faster than 256 ticks in a milisecond. A 16 bit timer with 65535 ticks might suffice for a 1ms depending on the clock rate. Every time the timer counter overflow interupt happens, this long remaining period gets deducted by 255 (or 65535), until what is remaining is less than 255 (or 65535). Then you set the output compare register of the timer to the remaining of the counts that are left (minus some timer clock ticks needed to change the register). Only then enable the outputcompare interupt. Then when the output compare interupt happens the time is right to flip an output pin. But yeah, this is a bit more complex than your average delay loop. But it has minimal MCU processing load.