You can create a custom user-defined aggregation function (UDAFs), currently in preview:
CREATE OR REPLACE AGGREGATE FUNCTION `project.dataset.latest_non_null`(
value STRING,
some_timestamp INTEGER)
RETURNS STRING
AS (
ANY_VALUE(value HAVING MAX if(value is null, null, some_timestamp))
);
SELECT
a,
project.dataset.latest_non_null(b, some_timestamp) AS latest_b,
project.dataset.latest_non_null(c, some_timestamp) AS latest_c,
FROM
foo
GROUP BY
a
Output: