I very much doubt the person trying to break it would know the code and therefore the way of breaking it and even if so, crashing the program will render the whole thing useless. It is also quite obvious that the system can be bypassed much more easily, even without touching the computer.
It is the second thing I do, first being CTRL+T, especially when on a server with block breaking/placing permissions. Also breaking the program does not render the whole thing useless as you then have access to the computer to do whatever you want.
I have used Lua in quite a lot of environments and loops are usually bad, as they take resources.
If your loops are taking resources then you're coding your loops wrong, and/or you have a memory leak in your program(s), a loop does not take more resources each time it runs, localised variables are cleaned up, and global variables are overridden with new ones, the only overhead a loop adds is the conditional checking, which is a very small overhead anyway, not much more than a function call.
I'm saying they are bad because in many other environments, "while true do" loops, if used incorrectly, crash the program due to the code being ran over and over again very fast, effectively running out of memory and crashing.
Based off that you should have the same stance against infinite recursion! But even more so, infinite recursion uses far more resources than a loop!
In ComputerCraft all routines that take any longer than ~10 seconds of runtime will be terminated to allow other routines and computers to run. This is the "failure to yield" error. As for other systems/environments well I'll semi agree, infinite loops aren't a good thing, but that is just because of the design paradigm that OSes and such are expecting from programs, the software life-cycle your programs are given just don't allow for infinite loops, and when you use them for too long your program is reported to the user as unresponsive…
It is best to learn not to use them if other ways are possible.
The only other possible ways are recursion and tail calls. Recursion is worse to use than loops, it is far more resource intensive, it uses much more of the stack and heap, having to preserve the location in the function it was called, and keeping the entire variable scope of the function so that when it is returned to it can continue to run. Tail calls are much better than recursion, not too sure where they sit against loops, as I've rarely used them so haven't researched them in-depth, and they aren't available in every language.