Как можно корректно написать асинхронный метод у объекта в typescript с дженериком?
Что именно ты хочешь сократить, вроде ж дальше некуда: один тип на вход - один на выход?

Ну можешь убрать async и await, они здесь не нужны:
const ApiServiceModule = {
  get: <T>(url: string): Promise<T> => fetch(url)
    .then(response => response.json())
    .catch(err => console.error(err))
} async/await всего лишь сахар над Promise и в данном случае ничего не делают, т.к fetch и так возвращает Promise.

P.S. Ну и методом я бы это не назвал, это свойство с функцией. Метод имеет доступ к this.
В дополнение к Aetae - дженерик здесь тоже не нужен
Да, парсинг JSON возвращает any (по историческим причинам) и его вот таким дженериком можно легко кастануть в любой тип. Только зачем вообще использовать TypeScript если мы вечно его затыкаем своей правотой?
Даже если данные приходят с нашего сервера, и мы точно знаем их тип - их нужно проверять, ибо нет гарантии, что никто не ошибся на бэке, что мы не ошиблись в описании типа в который кастуем.
Поэтому должен быть тип unknown, чтоб TypeScript требовал все проверить перед использованием:const ApiServiceModule = {
  get: (url: string): Promise<unknown> => fetch(url)
    .then(response => response.json())
    .catch(err => console.error(err))
}