Generating a short pulse after a delay
Expanding on my comment, after checking experimentally that this was
indeed the issue.

Short answer

You should do



TIFR1 = _BV(OCF1A);  // clear interrutp flag


right before

TIMSK1 |= _BV(OCIE1A);  // enable match interrupt


Explanation

Whenever the timer reaches the value stored in one of its “compare
match” registers, this triggers a “compare match” event, which has the
effect of raising the corresponding interrupt flag (OCF1A in your
case). If the associated interrupt is enabled, that fires an interrupt
request, and the flag is automatically cleared when the CPU starts
executing the interrupt vector.

However, if the interrupt is not enabled, the flag just stays set. If
you later enable the interrupt when the flag is already set, the
interrupt request is sent immediately. This is not what you want, you
want the interrupt to fire only on the next match. For this to happen,
you have to clear the interrupt flag prior to enabling the interrupt.

The interrupt flags have a very non-intuitive behavior: you clear the
flag by writing a logic one to it. Thus the line:

TIFR1 = _BV(OCF1A);  // clear interrutp flag


For completeness, I would also clear ICF1 before enabling ICIE1,
although this seems to not be critical for the working of your program.

Also, as a side note, be aware that the timer can increment while the
CPU is in the middle of executing TCNT1 = TCNT1 - ICR1;. If you want
the cleanest possible timings, leave the timer free-running and just set
OCR1A to the appropriate values: ICR1+pulse_delay, then
ICR1+(pulse_delay+pulse_length).