This is actually question 7.21 in the R FAQ (https://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f
The most important part of that answer is near the end where it points out that it is often easier to use a list. @Clemsang gave an example of using a list in a for loop.
Using a list instead of global variables makes it much less likely that you will accidentally overwrite another variable and make it much easier to work with your results. If you want to do something with each of your new matrices, then you can just reference them in a loop similar to how they were created instead of having to worry about get (or use lapply or sapply to make it even easier) and if you want to copy/save/delete/etc. all the matrices, you have a single object to work with instead of needing to loop again.
In your example above, the main result of the loop is to make several assignments. In this case it is often easier and better to use a lapply or a related function instead of the explicit loop. For example:
garage <- lapply( 1:5, function(v1) {
matrix( rnorm(v1^2, 10, 3), v1, v1)
} )
names(garage) <- sprintf("cart_%d", 1:5)
garage[["cart_3"]]
tmpvar <- "cart_5"
garage[[tmpvar]]
sapply(garage, det)
rm(garage)