As someone that's just recently started the climb up the learning curve on micropython and python, I can appreciate the original question of this topic, as I've spend some time looking into it myself and have landed here a few times during my Google searches.
The answer pythoncoder provides is the correct one -- if you want to read a line of text without echo, readline() will process incoming bytes until the new-line and then return that result in a string.
I think what may be a bit unclear for people new to the micropython world is the distinction between when you are interacting with the REPL and when you're interacting with (user-created) code running on the board. When the user's code is running (either through booting up the board and running main.py, or by calling a function from the REPL and thus running in the code), the input/outputs are with the code, and no longer involves the REPL until the program is exited (either through a keyboard interrupt or via a sys.exit() call) and control passes back to the REPL.
Related to this (at least for my own purposes), you might have a desire to read data from stdin when there is data, but not block while that is happening. The post at
viewtopic.php?t=7325 is helpful -- but only talks about the case of reading one byte at a time with read(1). read(1) can be replaced with readline() for a blocking read to the newline once characters start arriving.