I just went through this exact exercise last month. The 301 was required by our marketing team because they wanted to transfer page rank (i.e. limit negative impact to search engine ranking). I don't think there's any way to send a 301 AND other content. That kinda goes against the intention of the 301 status code. Even the flexibility of iRules can't change that ;)
Here are the options we came up with...
1) Send a 301 to a landing page on bbb.com that says "you've been redirected..." and after 5 seconds, redirect to the homepage of bbb.com.
Problems: This doesn't meet the requirements. First, it will not get the user to the same URI on bbb.com. In addition, it will not transfer page rank to the correct URI...just to the new domain.
2) Same as option 1, except you pass some identifier to the langing page that tells it where to redirect to after 5 seconds. (i.e. www.bbb.com/landing_page.html?destination=/original_uri)
This method also does NOT transfer the page rank to the correct URI and there are some risks to passing things in the URI. These problems were enough for us to discredit this option.
3) This was the best option for us. Send the 301 redirect from aaa.com/uri to bbb.com/uri. Then on bbb.com add a javascript to our global header that displayed a modal dialog explaining the redirect and then it disappeared after 5 seconds (revealing bbb.com/uri behind it). This transferred the page rank to the correct page AND showed the dialog explaining the redirect.
One important note: we tried to use the referred to decide when to pop up the dialog, but it was not consistently sent with the redirect. Instead, we had to add a querystring to indicate that /uri was requested as the result of the 301 (i.e. bbb.com/uri?redirect=true)