Macros in Elixir are "true" compile-time macros... They take the AST as an argument, and are expected to return an AST. Possibly the first, or one of the first, implementations of "true" macros in a non-homoiconic language, which was previously a strong selling point of homoiconic (Lisplike, syntax-less) languages.
Erlang does something very similar.
Erlang Source Code -> Erlang Abstract Format --> Core Erlang --> BEAM bytecode
I'm pretty sure that LFE doesn't skip the Erlang Abstract Format step
I'm also in your camp (not liking Elixir or Erlang's syntax, but really liking BEAM). I like Clojure a whole lot, but would prefer it on BEAM for a whole variety of reasons. LFE seemed like a step back from Clojure in many ways when I looked at it.
You might find Joxa interesting, it predates Elixir, but came after LFE and is patterned on Clojure.