Статика не совсем означает «общий для всех экземпляров» - это означает «вообще не связанный с конкретным экземпляром». Другими словами, вы можете получить статическое поле в классе A, не создавая каких-либо экземпляров.
Что касается запуска двух программ в одной и той же JVM - это действительно зависит от того, что именно вы подразумеваете под «запуском двух программ». Статическое поле эффективно связано с объектом класса, который, в свою очередь, связан с загрузчиком классов. Поэтому, если эти две программы используют отдельные экземпляры загрузчика классов, у вас будут две независимые статические переменные. Если они оба используют один и тот же загрузчик классов, тогда будет только один, поэтому они будут видеть изменения друг друга.
Что касается альтернативы - существуют различные варианты. Один из них - передать ссылку на «общий» объект в конструктор каждого создаваемого вами объекта, который в этом нуждается. Затем необходимо сохранить эту ссылку для дальнейшего использования. Это может быть немного больно и высосать немного больше памяти, чем статический подход, но это облегчает тестирование.