曖昧なコメントで申し訳ないですが
VT_I4
ではなくて
VT_BYREF|VT_I4
などとしないといけないということはないでしょうか?
同一空間上のメソッド呼び出しにVARIANT構造体のアドレスを渡すようなことをすれば値渡しでも参照渡しでも自由に行えますが、空間や言語をまたがるCOMメソッド呼び出しを考えると全ての値は空間(プロセス間とかホスト間とか)の移動や言語間での形式変換のためマーシャリングが行われると思います。参照渡しと値渡しの区別のため「参照です」という指定をしないと参照渡しとしてのマーシャリングをしてくれなかったように思います。
ただ、Pythonではできたとのことなのでやり方自体は正しくてCOMサポートライブラリーの動作がおかしいのか、COMラッパーの違いによる仕様の差異なのかどちらも考えられるような気はします。
もしPythonとJNAでの仕様の違いだったと仮定すると・・・jnaで用意されているメソッドを具体的にどう使えばよいかまではわかりませんが、いくつかサンプルを眺めていると低水準のIDispatchインターフェースを直接起動するようなコードの中に
Variant.VARIANT.ByReference result = new Variant.VARIANT.ByReference();
のようなコードを見かけました。
https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/COM/util/HybdridCOMInvocationTest.java
これが上記に関係するのかも知れません。上記は低水準インターフェースであるIDispatchインターフェースを用いているらしき箇所で見かけましたが、IDispatchではメソッドの戻り値も引数として渡すためByReferenceを用いているのだろうと思いました。なおVARIANT.ByValueというクラスもありこちらが値渡し用と思います。