Off the top of my head:
- lazy vs. eager (aka non-strict vs. strict or call-by-need vs. call-by-value): are function arguments evaluated before the function application, or after, or never?
- pure vs. impure: does the language allow functions to have side effects? Does it have mutable references?
- static vs. dynamic: does the language check types at compile time or runtime?
- algebraic datatypes: does the language support pattern matching over variant types?
- metaprogramming: does the language provide a powerful code generation system?
- concurrency and parallelism: are threads/processes a first-class abstraction? Does the language make it easy to run multiple computations at the same time?
- "exotic" types: how expressive is the static type system? GADTs? Dependent types? Linear types? System F?
Only the first two items are really unique to functional languages (i.e., almost all imperative languages are eager and impure).