The issue with the difference between HEAD^^ and HEAD is that you have an a.txt in both commits, so just considering those two commits (which is what diff does), there is no rename, there is a copy and a change.
To detect copies, you can use -C:
git diff -C HEAD^^ HEAD
Result:
index ce01362..dd7e1c6 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-hello
+goodbye
diff --git a/a.txt b/test/a.txt
similarity index 100%
copy from a.txt
copy to test/a.txt
Incidentally, if you restrict your diff to just one path (as you do in git diff HEAD^^ HEAD a.txt you aren’t ever going to see the renames or copies because you’ve excluded the everything apart from a single path and renames or copies – by definition – involve two paths.