Декоратор - это в самом простом варианте функция, принимающая на вход другую функцию и возвращающая третью. Чтобы использовать синтаксис с собачкой, декоратор должен уметь работать с одним единственным позиционным аргументом, а ваш loading_bar требует двух.
def loading_bar(async_func):
@wraps(async_func)
async def wrapper(*args, **kwargs):
await func(*args, **kwargs)
return wrapper
@loading_bar
async def my_async_func(): pass
ctx в данном примере взяться неоткуда, так что придется добавлять его в параметры wrapper и во все вызовы декорированной функции. Как именно - Вам виднее с полным кодом.