first of all, I cannot replicate your Output 2. I assume you use tidyr::pivot_wider() (I write this, because there is a dot after your pivot_wider, so maybe those are indeed different functions I am not aware of)?
To achieve your desired goal, you can use the following:
The behaviour of pivot_wider() however is logical. You force it to reshape the data on non unique entries (e.g. your id column dates is always the same, so it should be one row after reshaping, but the column names come from variables, which contain c twice). Hence, pivot_wider() does not know how to put two values into one cell, other than creating a list and informing you to specify a function which reduces all duplicates to just one actual entry.
Basically your pivoted groups need to all have length == 1. Group "a" has 1 row, group "b" has 1 row, and group "c" has two rows. tidyr defaults to returning your results in a list column when this doesn't happen. data.table (and tidytable) return the length of each group when length != 1. So that's why Output 2 has a result of a=1, b=1 and c=2.
Output 1 is returning things in a list because that's what you're choosing. Try using values_fn = mean and you'll see values_fn is essentially applying an aggregation function to each group.
That being said - since you're returning lists (which is the correct approach), all we need to do is convert all of the lists to vectors using unlist(), grouped by your non-list columns (in this case "date"). We can do this using summarize(), and this will expand the data frame.