As, much as I know about WordPress we have to ways to achieve this.
First: You have to retrieve all posts written by an author an then you can fetch categories assigned to those posts. Store them in an array uniquely.
$args = array('author' => $author->ID, 'posts_per_page' => -1, 'fields' => 'ids');
$authorArticles = get_posts($args);
$postList = array();
foreach($authorArticles as $key => $article){
if(!in_array($article, $postList)){
$postList[$key] = $article;
}
}
$termsList = array();
$siteURL = site_url('/category/');
foreach($postList as $article){
$terms = get_the_terms($article, 'category');
foreach($terms as $term){
if(!isset($termsList[$term->term_id])){
$termsList[$term->term_id] = ['term_id' => $term->term_id, 'term_url' => $siteURL.$term->slug];
}
}
}
echo '<pre>', print_r($termsList), '</pre>';
Second: As, suggested by @Jacob you have to use SQL for retrieving list of categories.
Best Regards,