The following lines in the KafkaConsumerThread::setOffsetsToCommit(...) suggests a race condition with the asynchronous callback from committing offsets to Kafka:
In the main consumer thread's main loop, nextOffsetsToCommit will be checked if there are any offsets to commit. If so, an asynchronous offset commit operation will be performed. The NPE happens in the case when the commit completes, but this.offsetCommitCallback = commitCallback; is not yet reached.
A possible fix is to make setting the next offsets to commit along with the callback instance a single atomic operation.