For an integrated scripting language, MAXScript really is not so bad. It is very powerful for automations within the software and can be used for more generalized tasks on top of that, like reading/writing/moving files, if you wish to do so. I have seen people implement fully-fledged 2D fluid solvers plus visualization in it (not saying that it is a great idea, but hey, you can!)
However what it seriously lacks are some common data structures that are used in other languages for day-to-day development tasks. The most prominent example for this is the lacking of a dictionary datatype in MAXScript; we can not easily define arbitrary mappings from keys to values. While the underlying C++ SDK has a Hashtable for this, it is (for some mysterious important reason) not exposed to the MAXScript engine.
Dictionaries are just so very versatile, easy to use and provide great lookup performance. Coupled with lists, you can define almost any complex data structure; Just check out the JSON file format, it is simply a combination of lists and dictionaries.
Python has all this, but the current state of the native Python support inside 3ds Max 2015+ is rather disappointing and the Blur guys seem to have abandoned their Py3dsMax project (at least the public version), so that is also not an option. While I hope it will get better in the future, I often find myself knee-deep in MAXScript code until then.
Since there is no builtin solution, people have started writing their own implementations, going from very simple structs that map this to that, to more generalized solutions with more or less better performance. Some examples:
The first example uses an underlying .NET hashtable to implement the dictionary. This provides proper read performance, since we do not have to iterate a list and can use a fast hashvalue-lookup. However, it also limits us to use only strings for both keys and values, since this is the only thing the .NET hashtable understands.