Yes, at least two better solutions.
The first one applies if your entire point-cloud is not too big i.e. it fits in memory (which is what you plan to do reading all files). You can simply read all files as one.
ctg = readLAScatalog("folder/")
las = readLAS(ctg)
This is pretty similar to your solution but all the rbind.LAS
job is done internally at the C++ level in a much more memory efficient way.
The second solution is much better and works even if the merged point-cloud does not fit in memory by streaming the points into a single output file. See the chapter about retiling in the lidR book. The idea is to retile but with a chunk size larger than the whole collection. Something like that should work:
opt_output_files(ctg) <- "folder/singlefilename"
opt_chunk_buffer(ctg) <- 0
opt_chunk_size(ctg) <- 10000
singlefile_ctg <- catalog_retile(ctg)