This behavior is known as a function's "side-effect". It may be easier to understand with a more relatable example.
my_plot <- plot(iris$Sepal.Length, iris$Sepal.Width)

Created on 2020-07-26 by the reprex package (v0.3.0)
If you type this into RStudio, you will see an object called my_plot in the Environment pane containing the value NULL (empty). This is the return value of plot(); it returns nothing. Instead, it has an action (or more formally a side-effect) that prints the generated plot.
In the same way, the console output you see when you call str() is the function's side-effect since the return value is hidden. However, when you call lapply() with str(), you get the return value of calling str() on each element i.e. a list of NULLs.
P.S. It's not necessary that side-effect functions should return nothing. The return values of ggplot2 function calls for example are lists.