Getting an ACK failure right away after writing slave address in interrupt mode for I2C [STM32F4]
ST's HAL could be generating a racing condition when called inside an ISR. As mentioned by @Justin, you don't want to occupy the CPU for too long when in an ISR. For your NACK when writing inside an ISR I see two solutions:

Use a flag. Set it on the ISR, on your main loop check for the raised flag, if so send the data through I2C;

Use DMA. HAL DMA calls are not blocking and the driver will deal with writing on the peripheral themselves.


Solution 1 is simpler but less deterministic. 1 would look something like:
static volatile uint8_t i2cSendFlag = 0;

void I2C1_EV_IRQHandler(void){
    i2cSendFlag = 1;
    I2C_ClearFlag(&lt;the active ISR on your code&gt;);
}

static I2CDoWork(void){
    if(i2cSendFlag){
        // Send your data

        // Clear the send flag
        i2cSendFlag = 0;
    }
}

int main(void){
    I2CConfig(I2C1);
    for(;;){
        I2CDoWork();
        // Rest of your code
    }
}

The ISR being called only once seems like peripheral's flags are not been cleared. From 1 each active ISR event is cleared by a differently method. On your HAL configuration step witch event flags are active? Check the below table to see how to clear the corresponding event on the ISR function.