As far as multiple calls of MESHSMOOTH goes, I'm not sure you can achieve it inside a while loop.
However, you could use the while loop to calculate every command that is required to take place and then execute the commands via vla-sendcommand. Tested this below and it works to perform a MESHSMOOTH and then MESHSMOOTHLESS on multiple objects. Technically it could also call any function code you have written which would perform multiple complex lisp operations on an object.
The trick here is that the vla-sendcommand code cannot take an entity as input like vl-cmdf or command, instead, it requires a string only; however you can type variable names into the prompt; so this code attempts to set every object you've selected into it's own variable (obj1, obj2, obj3, ...) and then builds an array of commands to call using the !obj1 or !obj2 reference. Finally, it executes all those commands in sequence.
(defun C:MultiSmooth
( / objects objlst varnam varlst varset lst
) lst nil)
lst
(cons (strcat "MESHSMOOTHLESS !" obj
" ") lst
) )
)
)
(defun LM:lst
->str
( lst del
) )
)