Get value from withTimeout

Local variables in a coroutine don't need to be atomic because of the happens-before guarantee even though there may be some thread swapping going on. Your code doesn't have any parallelism, so you can use the following:

runBlocking {    
    var receivedMessages = 0
    withTimeoutOrNull(someTimeout) {
        while (isActive && receivedMessages < expectedAmount){
            val message = incomming.receive()
            // some filtering
            receivedMessages++
        }
    }

    println("I've received $receivedMessages messages") 
}

If you do have multiple children coroutines running in parallel, you can use a Mutex. More info here