Selecting the max date out of a text group
You need to choose max(question_date) per subject. Something like:

WHERE question_date IN (
    select max(question_date) 
    FROM messages
    WHERE subject = a.subject 
)


Another option is to enumerate using OLAP functions and choose most recent subject using that:

select
  new_subject,
  message_id,
  product_id,
  si,
  question_date
from (
       select
         trim(both ' ' from regexp_replace(a.subject, 'RE:|Re:', '', 'g')) as new_subject,
         *,
         a.seller_id as si

       , row_number() over (partition by a.subject
                            order by question_date desc) as rn   

       from messages a
         INNER JOIN sellers b
           ON a.seller_id = b.seller_id
       WHERE a.product_id = 0
     ) as x

WHERE rn = 1 

GROUP BY new_subject, product_id, message_id, question_date, si
ORDER BY new_subject, question_date DESC;


The first alternative will return several rows per subject in case they have the same question_date. The second alternative will return only one 
 row per subject. Using rank() instead of row_number() makes the second alternative to behave like the first one.

You may have to add another level of nesting to take into consideration that several subjects may map to the same new_subject:

select new_subject, message_id, product_id, si, question_date
from (
    select
      new_subject,
      message_id,
      product_id,
      si,
      question_date,            
      row_number() over (partition by new_subject
                         order by question_date desc) as rn   
    from (
           select
             trim(both ' ' from regexp_replace(a.subject, 'RE:|Re:', '', 'g')) as new_subject,
             *,
             a.seller_id as si
           from messages a
             INNER JOIN sellers b
               ON a.seller_id = b.seller_id
           WHERE a.product_id = 0
         ) as x
) where rn = 1
ORDER BY new_subject, question_date DESC;