This is by design from ASP.NET MVC. This is a template method, and it will always be called.
However, if you want to skip code execution for performance reasons if the call is for a child action. Wrap the code with an if statement like this:
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
if (!ControllerContext.IsChildAction) {
.....
}
}