... you need to view ASH as data, not code. ...
Von Neumann architecture. Code is (a form of) data.
-----
Upon some reflextion, you could say that the execution (runtime) stream of ASH code becomes a stream of JVM bytecode (ordered by how it's executed) [1]. This could probably be useful abstraction in some theoretical analysis.
It doesn't help optimization. I mean, we have techniques like "Trace optimization" which improves prediction rate on branches (and decisions on what-to-JIT) based on what data was actually used in the past of this run of the program, but I don't think that will help much in this case - first you have the processor optimizing JVM's code, then you have JVM optimizing mafia's code, and then you don't have mafia optimizing ASH code in this wat, at least to my understanding.
That's way too many layers of indirection, I expect the effects through them will be too chaotic to reliably improve performance.
[1] maybe clarification: I don't mean program code in memory, I mean the sequence of codes seen by the processing unit (processor, JVM, mafia, ...). A loop like while (true) { i++; } will be seen as infinite stream of i=i+1 instructions. Did I make that sufficiently beaten with a dead thread?