Not directly possible with typedefs; wherever a typedef is used, it is equivalent to the original type, so if you write
typedef boost::function<void(A)> B;
typedef boost::function<void(B)> A;
then B would be equivalent to boost::function<void(A)>, 
which is equivalent to boost::function<void(boost::function<void(B)>)>, and so on, until you get
boost::function<void(boost::function<void(boost::function<void(...)>)>)>
, which is a type of infinite length.
You can, however, define (at least) one of the two types as a struct or class:
struct A;
typedef boost::function<void(A)> B;
struct A
{
    B b;
    A(B b) : b(b) {}
    // optional:
    void operator() (A a) { b(a); }
};
You might need to add more constructors and/or a conversion operator to make the type behave completely "transparently", or you could just access the struct explicitly.