Ну, существует тысяча способов.
Например, пусть модуль B зарегистрирует в модуле A процедуру обратного вызова.
Код:
MODULE A;
VAR onReceive*: PROCEDURE;
...
(* получили данные *)
IF onReceive # NIL THEN onReceive() END;
...
END A.
Код:
MODULE B;
IMPORT A;
...
PROCEDURE OnReceive;
BEGIN ...
END OnReceive;
...
BEGIN
A.onReceive := OnReceive
END B.
Но лучше использовать ООП: создать один модуль, в котором описать абстрактные типы (объекты которых друг с другом тесно взаимодействуют), в других модулях реализовать эти типы, и, наконец, в последнем (главном) модуле эти объекты создать и "сцепить" друг с другом.