After some thinking and suggestions from user2246674 I managed to resolve the issue. It was not inside the threads, it was the main loop.
I had such code inside the main loop:
c = Curses.getch
unless c.nil?
# input handling
After adding sleep 1 to else
problem was resolved. It does nothing when there's no input from Curses, then checks again in one second, and this stops it from actively polling STDIN
and generating high CPU load