A forma que você está fazendo a verificação de cada parâmetro no seu código pode levar a resultados inesperados quando mais de um parâmetro é passado.

Uma solução seria criar um objeto where com os filtros necessários de acordo com os parâmetros passados, e depois passá-lo para o método findAll. Algo mais ou menos assim:

const where = { wallet_id: id };

if (type !== undefined) {
  where.type = type;
}

if (category !== undefined) {
  where.category_id = category;
}

if (startDate !== undefined) {
  if (endDate !== undefined) {
    where.expiry_date = { [Op.and]: [{ [Op.gte]: startDate }, { [Op.lte]: endDate }] };
  } else {
    where.expiry_date = { [Op.gte]: startDate };
  }
}

const filter = {
  where,
  attributes: ['id', 'type', 'value', 'expiry_date', 'category_id', 'wallet_id'],
};

const reportWallet = await Transaction.findAll(filter);

Dessa forma, apenas os filtros necessários são adicionados ao objeto where, e todos os parâmetros passados serão considerados na consulta.