Как преобразовать значение при использовании dataclass?
Я в таких случаях создаю фабричный метод.
@dataclass
class Person:
    first_name: str
    last_name: str
    bdate: date

    @classmethod
    def make(cls, first_name: str, last_name: str, bdate: str) -> 'Person':
        _bdate = datetime.strptime(bdate, '%Y%m%d').date()
        return cls(first_name=first_name, last_name=last_name, bdate=_bdate)

data = {
    'first_name': 'Adam', 
    'last_name': 'Smith', 
    'bdate': '20220617'
}
person = Person.make(**data)
Просто, коротко, позволяет реализовать любую логику приведения типов и вычисления значений по умолчанию, использует базовые механизмы Питона, при необходимости можно проигнорировать и использовать обычный конструктор (который мы не ломаем).

Но вообще это неправильное распределение обязанностей. Обязанность датакласса - хранить данные, а не менять их представление. За смену представления пусть отвечает тот код, который получает значение строки.
Возможно, вам стоит использовать Pydantic вместо dataclasses для этого: он позволяет создавать пользовательские валидаторы как отдельного поля, так и всех полей. Валидаторы можно использовать для преобразования типов данных. Что важно, он позволяет создавать пре-валидаторы, то есть те, которые будут применяться к полю перед стандартными валидаторами Pydantic. Например, вашу задачу можно решить так:
from datetime import date, datetime

from pydantic import BaseModel, validator


class Person(BaseModel):
    first_name: str
    last_name: str
    bdate: date

    @validator('bdate', pre=True)
    def bdate_from_string(cls, v):
        if isinstance(v, str):
            return datetime.strptime(v, '%Y%m%d').date()
        return v


data = {
    'first_name': 'Adam',
    'last_name': 'Smith',
    'bdate': '20220617'
}

person = Person(**data)
print(person)

Если вы не хотите использовать Pydantic, то можно посмотреть на продвинутую альтернативу dataclasses — attrs, может быть, там есть средства для решения вашей задачи.