A shell is efficient if you use it for what it has been designed for (though efficiency is rarely what you look for in a shell).
A shell is a command-line interpreter, it is designed to run commands and have them cooperate to a task.
If you want to count to 1000000000, you invoke a (one) command to count, like seq, bc, awk or python/perl... Running 1000000000 [[...]] commands and 1000000000 let commands is bound to be terribly inefficient, especially with bash which is the slowest shell of all.